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本身,跟这个类已经没有关系了,只是名字一样而已,如果不改,还是找全局的。

浙公网安备 33010602011771号