Python:使用属性来控制属性访问

时间:2014-07-17 00:09:22

标签: python oop properties attributes

我正在阅读本书 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)

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

非常感谢任何见解!

1 个答案:

答案 0 :(得分: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