zoukankan      html  css  js  c++  java
  • python之中特性(attribute)与属性(property)有什么区别?

    属性(property)是一种特殊的特性(attribute)。

    如下,我们定义了一个圆圈类(circle),圆圈嘛,自然就有直径(diameter)和半径(radius),我们可以设置他们为特性(attribute)。

    class Circle(object):
        def __init__(self, radius,diameter):
            self.radius = radius
            self.diameter = diameter
    

    然后进行实例化,打印出特性(attribute)值,并更改示例的特性(attribute)值,再次打印它们的值

    class Circle(object):
        def __init__(self, radius,diameter):
            self.radius = radius
            self.diameter = diameter
    
    # 实例化
    my_circle = Circle(2,4)
    print('radius is {}'.format(my_circle.radius))
    print('diameter is {}'.format(my_circle.diameter))
    
    
    # 将直径改为6
    my_circle.radius = 6
    print('radius is {}'.format(my_circle.radius))
    print('diameter is {}'.format(my_circle.diameter))
    

    运行结果如下

    radius is 2
    diameter is 4
    radius is 6
    diameter is 4
    

    我们发现,半径(radius)为2的时候,直径(diameter)为4。但是我们把半径改为6的时候,按照常理直径应该为8,但此时直径仍为4。因此我们希望程序能够自动根据我们的半径值计算出对一个的直径,也能根据直径计算出对应的一个半径,这时候我们就需要@property了。

    我们修改原来的代码如下:

    class Circle(object):
        def __init__(self, radius):
            self.radius = radius
            
        @property
        def diameter(self):
            return self.radius * 2
        @diameter.setter
        def diameter(self, new_diameter):
            self.radius = new_diameter / 2
    
    # 实例化对象
    my_circle = Circle(2)
    print('radius is {}'.format(my_circle.radius))
    print('diameter is {}'.format(my_circle.diameter))
    
    # 将半径改为6
    my_circle.radius = 6
    print('radius is {}'.format(my_circle.radius))
    print('diameter is {}'.format(my_circle.diameter))
    
    # 将直径改为6 
    my_circle.diameter = 6
    print('radius is {}'.format(my_circle.radius))
    print('diameter is {}'.format(my_circle.diameter))
    

    此时结果如下

    radius is 2
    diameter is 4
    radius is 6
    diameter is 12
    radius is 3.0
    diameter is 6.0
    

    从上可知,property其实就是一个带有函数功能的attribute,attribute的值是静态的,而property是一个动态的attribute,我们可以根据需要改变它的值。

    而在本质上,property能够实现这个动态的改变值的功能,是由于它有__get__、__set__ 和 __delete__方法。我们上面给diameter增加了@property和@diameter.setter,就是给diameter这个特性(attribute)增加了__get__ 和 __set__方法,从而通过调用这两个方法去改变了原来静态的特性(attribute)值,使它成为了一个属性(property)。

    所以说属性(property)是一种特殊的特性(attribute)。

    我们现在一般常把attribute称作属性,那么对应的我们把property理解为属性函数,或许这样更能与它们的特性和功能对应了。


    参考文档

    1.https://www.zhihu.com/question/40015172/answer/284427895

    2.https://stackoverflow.com/questions/7374748/whats-the-difference-between-a-python-property-and-attribute

  • 相关阅读:
    网安-04-DHCP部署与安全、DNS部署与安全
    网安-03-NTFS安全权限、文件共享服务器
    网安-02-批处理、病毒、用户与组管理、破解系统密码
    网安-01-IP详解及简单的DOS命令
    [异常笔记]required a bean of type 'org.quartz.JobExecutionContext' that could not be found
    [异常笔记]poi读取Excel异常
    CentOS7 minimal 没有netstat命令
    Docker运行Nginx服务器
    大数据开发从入门小白到删库跑路(一)- 获取Hadoop
    Docker 运行MangoDB
  • 原文地址:https://www.cnblogs.com/sincere-ye/p/13388834.html
Copyright © 2011-2022 走看看