一. 类的成员共分为三类: 字段, 方法, 属性
class Foo: country = ‘中国‘ # 静态字段 def __init__(self, name): self.name = name # 普通字段 def func(self): # 普通方法, 至少有一个self参数 pass @staticmethod # 静态方法, 无默认参数 def func2(): pass @classmethod # 类方法, 至少有一个cls参数 def func3(cls): pass @property # 属性 def func4(self): pass
一. 字段: 静态字段, 普通字段
通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段
静态字段访问方法
静态字段属于类, 静态字段通过类访问, 静态字段在内存中只保存一份
print(Foo.country)
普通字段访问方法
普通字段属于对象, 普通字段需要通过对象来访问, 普通字段在每个对象中都要保存一份
obj = Foo(‘123‘)
print(obj.name)
二. 方法: 普通方法, 静态方法, 类方法
三种方法在内存中都归属于类, 区别在于调用方式不同
普通方法: 由对象调用, 至少一个self参数, 执行普通方法时, 自动将调用该方法的对象赋值给self
obj = Foo(‘1232‘)
obj.func()
静态方法: 由类调用, 无默认参数
Foo.func3()
类方法: 由类调用, 至少一个cls参数, 执行类方法时, 自动将调用该方法的类复制给cls
Foo.func2()
相同点: 对于所有的方法而言, 均属于类(非对象)中, 所以, 在内存中也只保存一份
不同点: 方法调用者不同, 调用方法时自动传入的参数不同
三. 属性
定义时, 在普通方法的基础上添加 @property 装饰器, 属性仅有一个self参数
调用时, 无需括号, 这样节省时间
对于简单的方法, 当无需传参且有返回值时, 可以使用 @property
obj = Foo(‘1232‘)
obj.func4
四, 字段, 方法, 属性都有私有和公有, 需要在前面加上__, 例如def __func(): pass __country = ‘China‘
私有字段, 方法, 属性在调用时, 一般情况下都无法访问, 需要在类中访问
在继承时, 子类无法查看父类的私有字段, 方法, 属性
对于简单的方法, 当无需传参且有返回值时, 可以使用 @ property
五. 嵌套
class People(object): def __init__(self, name, address): self.name = name self.address = address def play(self): print(‘玩‘) obj1 = People(‘企稳‘, ‘1000000‘) obj2 = People(‘戊二醛‘, ‘1010000‘) class Province(object): def __init__(self, name, location): self.name = name self.location = location self.people= None p1 = Province(‘江苏‘, ‘china‘) p2 = Province(‘北京‘, ‘china‘) p1.people = obj1 p2.people = obj2 print(p1.people.name) print(p1.people.address) print(p1.name) print(p1.location) p1.people.play()
原文地址:https://www.cnblogs.com/NachoLau/p/9550576.html