簡體   English   中英

Python 類屬性和類常量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM