我正在阅读本书 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)
代码如何工作? (首先调用哪个方法,然后调用哪个方法。)
非常感谢任何见解!
答案 0 :(得分:1)
在__init__
函数中,作业self.radius
调用@radius.setter
函数。它是用于将值存储在self.__radius
。
示例:
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