🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] 类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有, **在内存中只存在一个副本**, 这个和C++中类的静态成员变量有点类似。对于公有的类属性,在类外可以通过类对象和实例对象访问 # 类属性 ~~~ class People(object): name = 'Tom' #公有的类属性 __age = 12 #私有的类属性 p = People() print(p.name) #正确 print(People.name) #正确 print(p.__age) #错误,不能在类外通过实例对象访问私有的类属性 print(People.__age) #错误,不能在类外通过类对象访问私有的类属性 ~~~ 总结 * Python中没有像C++中public和private这些关键字来区别公有属性和私有属性 * 它是以属性命名方式来区分,如果在属性名前面加了2个下划线`'__'`,则表明该属性是私有属性,否则为公有属性(方法也是一样,方法名前面加了2个下划线的话表示该方法是私有的,否则为公有的) 因此,要访问类属性有两种方式 **注意** 如果使用`对象.类属性=值`赋值语句,只会给**对象添加一个属性**,而**不会影响到类属性的值** # 实例属性(对象属性) ~~~ class People(object): contry = 'china' p=People() p.contry='japan' print(People.contry) print(p.contry) del p.contry print('-'*30) print(People.contry) print(p.contry) ~~~ 输出 ~~~ china japan ------------------------------ china china ~~~ 如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。 如果通过实例对象去引用,会产生一个同名的实例属性, 这种方式修改的是实例属性,不会影响到类属性, 并且之后如果通过实例对象去引用该名称的属性, 实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。 # `__class__` 对象的类属性指向类对象 ~~~ class T(object): num= 0 def __init__(self, age): self.age = age self.num = 1 t = T(11) print(t.__class__.num) ~~~ 输出 ~~~ 0 ~~~ # 名字重整 私有属性我们获取不到,这是为什么呢? 因为py把他名字重整了 ~~~ class Test(object): def __init__(self, name): self.__name = name a = Test('laowang') # 不能用 a.__name,因为他把名字改了 # 查看 print(a.__dict__) # 获取 print(a._Test__name) # 测试下 a._Test__name = 11 # 查看 print(a.__dict__) # 获取 print(a._Test__name) ~~~ 输出 ~~~ {'_Test__name': 'laowang'} laowang {'_Test__name': 11} 11 ~~~