Python类属性和类常量

时间:2015-06-18 17:37:09

标签: python

我正试图与#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

2 个答案:

答案 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是一个类属性,对任何实例化对象都是通用的