day6-类的公有属性
概述
前面我们讲了类的私有属性,现在我们来说说类的公有属性,这边很容易被人弄混淆,有人认为,在__init__()构造方法中,除了私有属性,其他的都是公有属性了,其实这是一个错误的结论,并不是定义在__init__()初始化方法中的属性是公有属性(除私有属性),那什么是公有属性呢?
定义:指的是所属这个类的所有对象,都可以访问的属性,叫做公有属性。
公有属性
1.定义公有属性
class Role(object): nationality = 'Janpan' # 在类里直接定义的属性即是公有属性 def __init__(self, name,life_value=100, money=15000): self.name = name d1 = Role("Dick") d2 = Role("Jacky") print(d1.nationality, d2.nationality) # 所有的成员变量都可以访问 #输出 Janpan Janpan
那么这里有个疑问,d1.name,d2.name也可以访问,也可以修改, 为什么不能叫公有属性呢?接着下面的例子:
class Role(object): nationality = 'Janpan' # 在类里直接定义的属性即是公有属性 def __init__(self, name,life_value=100, money=15000): self.name = name def buy_gun(self, gun_name): print("just bought %s" % gun_name) d1 = Role("Dick") d2 = Role("Jacky") print(d1.name, d2.name) # 所有的成员变量都可以访问 #输出 Dick Jacky
由此结果可以看出,name是每个对象的属性,并不是共享,而是独立的 。
2.类访问公有属性
class Role(object): nationality = 'Janpan' #在类里直接定义的属性即是公有属性 def __init__(self, name, role, weapon, life_value=100, money=15000): self.name = name self.role = role self.weapon = weapon self.life_value = life_value self.money = money r1 = Role('dick', 'police', 'AK47') #生成一个角色 r2 = Role('Jacky', 'terrorist', 'B22') #生成一个角色 print(r1.nationality) #访问公有属性 Role.nationality = "CN" #修改公有属性 (r1,r2都改了) print(r2.nationality) #输出 Janpan CN
3.公有属性特性
class Role(object): nationality = 'Janpan' #在类里直接定义的属性即是公有属性 def __init__(self, name, role, weapon, life_value=100, money=15000): self.name = name self.role = role self.weapon = weapon self.life_value = life_value self.money = money def shot(self): print("shooting...") def got_shot(self): print("ah...,I got shot...") def buy_gun(self, gun_name): print("just bought %s" % gun_name) self.weapon = gun_name r1 = Role('dick', 'police', 'AK47') #生成一个角色 r2 = Role('Jacky', 'terrorist', 'B22') #生成一个角色 print("======before=change====") print(r1.nationality) print(r2.nationality) print("====1==after=change====") r1.nationality = "SIW" print(r1.nationality) print(r2.nationality) print("====2==after=change====") Role.nationality = "CN" #更改类的公有属性 (r1,r2都改了) print(r1.nationality) print(r2.nationality) #输出 ======before=change==== Janpan Janpan ====1==after=change==== SIW #r1对象的公共属性被修改了,实例属性会屏蔽掉同名的类属性 Janpan ====2==after=change==== SIW #r1对象的公共属性值没有随着类本身的公共属性值修改而修改 CN
小结:
- 对象r1去访问nationality属性时,如果在成员属性中找不到,就会找公共属性,也就是说自己的属性找不到就去找父亲的属性
- r1.nationality="SIW" 相当于在自己对象内部又重新创建了一个新的局部变量,这个局部变量已经脱离了class本身,跟这个类已经没有关系了,只是名字一样而已,如果不改,还是找全局的。