有关类的公有属性的介绍

一、概念

  我们前面提到类的私有属性,也就是类中不能直接访问的。但是不是可以直接访问的属性就是公有属性呢?其实也不是。在__init__()构造函数中的属性,对外基本都可以访问,但是他们并不是公有属性。那什么叫公有属性呢?

  定义: 指的是所属这个类的所有对象,都可以访问的属性,叫做公有属性。

二、属性

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)# 输出CNCN

登录后复制

  公有属性而言,所有实例对象访问它得到的值是一样的。

 

三、公有属性的特性  

  我们不仅可以访问,还能改变公有属性。 

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)#输出175123683612817512368361281751236836128CN 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)#输出243457958509624345795851522434579585096US JP US

登录后复制

  所以 p1.nationality=’JP’,并没有修改类Person的公有属性,而是为自己创建了一个新的成员属性,因此p1的改变对类的公有属性没有影响。

 

以上就是有关类的公有属性的介绍的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2268075.html

(0)
上一篇 2025年2月27日 10:31:01
下一篇 2025年2月19日 01:48:37

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论