• 技术文章 >后端开发 >Python教程

    有关类的公有属性的介绍

    巴扎黑巴扎黑2017-07-17 15:58:06原创728

    一、概念

      我们前面提到类的私有属性,也就是类中不能直接访问的。但是不是可以直接访问的属性就是公有属性呢?其实也不是。在__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)
    
    # 输出
    
    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的改变对类的公有属性没有影响。

    以上就是有关类的公有属性的介绍的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:属性 公有
    上一篇:python之变量的学习介绍 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 在Django的视图(View)外使用Session的方法• python发腾讯微博代码分享• Python NumPy教程之数据类型对象• 浅谈Python的Django框架中的缓存控制• python实现2014火车票查询代码分享
    1/1

    PHP中文网