• 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

  • 相关阅读:
    c语言博客作业09
    c语言|博客作业08
    C语言|博客作业07
    C语言|博客作业06
    C语言|博客作业05
    C语言|博客作业04
    C语言|博客作业03
    关于Vue.js里面输入框在v-model之后如果给其绑定属性赋初始值导致绑定数据不响应问题
    前后端分离开发模式中关于前端取得分页数据时的分页问题(前端使用ant design pro)
    《电子病案在病案管理中存在问题及对策》文献阅读随笔
  • 原文地址:https://www.cnblogs.com/sincere-ye/p/13388834.html
Copyright © 2020-2023  润新知