定义: 指的是所属这个类的所有对象,都可以访问的属性,叫做公有属性。
二、属性2.1 成员属性class person(object): def __init__(self, name, job, phone, address): self.name = name # 成员属性,属于某个实例对象 self.job = job self.phone = phone self.__address = address def get_private(self): return self.__address def sayhi(self): print("hell,%s" % self.name) p1 = person('bigberg', 'doctor', '8833421', 'hz') p2 = person('ashlex', 'police', '8833232', 'bj')
print(p1.job, p2.job) # 输出 doctor police
我们在person类下定义了两个对象,p1和p2。很显然我们没有办法让p1来访问到p2 的job属性,即police。那么在构造函数__init__()中的self.name等属性,被称之为 成员属性。
2.2 公有属性class person(object): nationality = 'cn' # 定义公有属性 def __init__(self, name, job, phone, address): self.name = name self.job = job self.phone = phone self.address = address def sayhi(self): print("hell,%s" % self.name) p1 = person('bigberg', 'doctor', '8833421', 'hz') p2 = person('ashlex', 'police', '8833232', 'bj') print(p1.nationality) print(p2.nationality) # 输出 cn cn
公有属性而言,所有实例对象访问它得到的值是一样的。
三、公有属性的特性我们不仅可以访问,还能改变公有属性。
class person(object): nationality = 'cn' # 定义公有属性 def __init__(self, name, job, phone, address): self.name = name self.job = job self.phone = phone self.address = address def sayhi(self): print("hell,%s" % self.name) p1 = person('bigberg', 'doctor', '8833421', 'hz') p2 = person('ashlex', 'police', '8833232', 'bj') print(person.nationality) # 调用 公有属性 person.nationality = 'us' # 改变 公有属性 print(person.nationality) #输出 cn us
3.1 单个实例调用和改变公有属性# 依据上例 print("--------befoer change---------") print(person.nationality) print(p1.nationality) print(p2.nationality) print("--------after change---------") print(person.nationality) p1.nationality = 'jp' print(p1.nationality) print(p2.nationality) # 输出
--------befoer change---------
cn
cn
cn
--------after change---------
us
jp
us
p1在修改之前我们可以很好理解,因为大家都是调用的类person的公有属性nationality,所以p1、p2的国籍属性是一样的,都是 'cn'。但是为什么在p1修改过公有属性后,p2的国籍属性没有改变呢?
在我们定义一个person类的时候,其实在内存中就已经存在了,当然也包含了这个类的公有属性。在最初实例p1去调用类person的nationality这个属性时,是直接引用类当中nationality的内存地址,而不是自己新增一个属性叫nationality。
如下所示:
print(id(person.nationality)) print(id(p1.nationality)) print(id(p2.nationality)) print(person.nationality, p1.nationality, p2.nationality) #输出 1751236836128 1751236836128 1751236836128 cn cn cn
这就可以解释为什么在person类中的nationality改变为 'us' 时,p2也跟着改变。因为是直接引用内存当中的值。
p1.nationality = 'jp'
在p1直接赋值nationality这个属性后,其实就实例p1为自己新增了一个成员变量,叫做nationality。只是他们的名称相同而已,但是两者之 间并没有联系,甚至内存地址也不相同。
# p1.nationality = 'jp' print(id(person.nationality)) print(id(p1.nationality)) print(id(p2.nationality)) print(person.nationality, p1.nationality, p2.nationality) #输出 2434579585096 2434579585152 2434579585096 us jp us
所以 p1.nationality='jp',并没有修改类person的公有属性,而是为自己创建了一个新的成员属性,因此p1的改变对类的公有属性没有影响。
以上就是有关类的公有属性的介绍的详细内容。
