【问题标题】:Python: Using Properties to Control Attribute AccessPython:使用属性控制属性访问
【发布时间】:2014-09-07 16:41:00
【问题描述】:

我正在阅读Python 3 编程一本书。在面向对象编程一章中,作者给出了一个使用属性控制属性访问的例子:

class Circle():

    def __init__(self, radius):
        self.radius = radius

    @property
    def radius(self):
        return self.__radius

    @radius.setter
    def radius(self, radius):
        assert radius > 0, "radius must be nonzero and non-negative"
        self.__radius = radius

为什么将数据属性radius改成属性时,变成__radius

如果我调用:(Shape.py 文件中的代码),有人可以明确解释一下吗

a = Shape.Circle(2)

代码将如何工作? (先调用哪个方法,然后,最后调用哪个方法。)

任何见解将不胜感激!

【问题讨论】:

    标签: python oop properties attributes


    【解决方案1】:

    __init__函数中,赋值self.radius调用@radius.setter函数。就是将值存储在self.__radius 中的setter 函数。

    例子:

    来源

    class Circle(object):
    
        def __init__(self, radius):
            self.radius = radius
    
        @property
        def radius(self):
            print 'GET'
            return self.__radius
    
        @radius.setter
        def radius(self, radius):
            print 'SET'
            assert radius > 0, "radius must be nonzero and non-negative"
            self.__radius = radius
    
    print 'creating circle:'
    c = Circle(2)
    print 'modifying radius:'
    c.radius = 3
    print 'verifying'
    print c.radius
    

    输出

    creating circle:
    SET
    modifying radius:
    SET
    verifying
    GET
    3
    

    注意SET 在创建圆时被调用。即使在__init__ 方法中,对象也尊重@radius.setter 函数。

    注意 #2:

    由于radius 是一个属性,而不是一个属性,因此您可以直接获取/存储它的值。如果您将c.radius() 作为函数调用。否则:

    c.radius()
    GET
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'int' object is not callable
    

    【讨论】:

    • 用 c.radius(3) 和 c.radius() 代替 c.radius = 3 和 c.radius 不是更好吗?
    • __init__() 调用@radius.setter 肯定是正确的方法!所以使用属性后,数据实际上是存储在__radius(私有属性)而不是radius
    猜你喜欢
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 2011-06-12
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多