[英]Python class property and class constants
我正在嘗試在 python 類中使用“getter”和“setter”。 我在下面定義了一個簡單的 Rectangle 類,其中每個 Rectangle 對象都定義了類變量長度和寬度。 有一個叫做 side 的類常量,它知道這個特定形狀的邊數。 現在,當我運行這個類時,一切正常。 我可以做類似的事情
>>> rect = Rectangle(2,3)
>>> rect.length
2
>>> rect.width
3
但是,如果我嘗試讓它打印出類常量邊,它只會返回這個
>>> rect.sides
<property object at 0x037F6C90>
而不是返回值 4. 我怎樣才能讓它返回值? 在一個可能相關的注釋中,我嘗試將 side 變量的屬性方法定義為這樣
@property
def sides(self):
return self._sides
這適用於其他對象變量,但是當我嘗試通過此方法訪問邊時,我收到一條錯誤消息,指出 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
你應該做這個 -
#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
對象,你可以使用type(rect.sides)
在你的例如,在它不起作用的地方,檢查它的類型是什么。
另外,要注意的是,如果你在getter
函數中返回self.sides
而不是self.__class__.sides
,它會繼續遞歸調用 getter 函數,導致 python 出錯 -
RuntimeError: maximum recursion depth exceeded while calling a Python object
嘗試使用 Rectangle.sides 作為 side 是一個類屬性並且對於任何實例化對象都是通用的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.