我正试图与#34; getters"和#34; setters"在python类中。我在下面定义了一个简单的Rectangle类,其中每个Rectangle对象都定义了类变量length和width。有一个称为边的类常数,它知道这个特定形状的边数。现在,当我运行这个课程时,一切正常。我可以做点像
>>> rect = Rectangle(2,3)
>>> rect.length
2
>>> rect.width
3
但是,如果我尝试打印出类常量边,它只会返回此
>>> rect.sides
<property object at 0x037F6C90>
而不是返回值4.如何让它返回值?在一个可能相关的说明中,我尝试将sides变量的属性方法定义为
@property
def sides(self):
return self._sides
这适用于其他对象变量,但是当我尝试通过此方法访问side时,我收到一条错误,指出Rectangle没有属性_sides。引用具有self.__class__.sides
的方面是否合适?
import abc
from Shape import Shape
class Rectangle(Shape):
sides = 4
def __init__(self, length, width):
super().__init__('Rectangle')
self.length = length
self.width = width
#The getters
@property
def sides(self):
return self.__class__.sides
@property
def length(self):
return self._length
@property
def width(self):
return self._width
#The setters
@sides.setter
def sides(self, value):
if value != 4:
raise ValueError('Error: Cannot set number of sides to be a value '
'other than 4.')
self._sides = value
@length.setter
def length(self, value):
if value <= 0:
raise ValueError('Error: Length must be positive.')
self._length = value
@width.setter
def width(self, value):
if value <= 0:
raise ValueError('Error: Width must be positive.')
self._width = value
def getArea(self):
return self.length * self.width
答案 0 :(得分:1)
你应该这样做 -
#The getters
@property
def sides(self):
return self.__class__._sides
而不是 -
#The getters
@property
def sides(self):
return self.__class__.sides
注意_sides
此外,在课程开始时,我认为您要初始化_sides
而不是sides
。
您需要使用与sides
不同的名称,因为sides
用于引用类属性,因此如果您尝试return self.__class__.sides
,它将直接返回property
} object,你可以在你的例子中使用type(rect.sides)
,它不起作用,检查它的类型。
另外,要注意,如果你在self.__class__.sides
函数内返回self.sides
,而不是getter
,它将继续递归调用getter函数,导致python错误输出 -
RuntimeError: maximum recursion depth exceeded while calling a Python object
答案 1 :(得分:0)
尝试使用Rectangle.sides,因为side是一个类属性,对任何实例化对象都是通用的