Python报”TypeError: ‘property’ object is not callable “的原因以及解决办法

yizhihongxing

Python中有一种特殊的属性叫做@property,它有以下几个作用:

  1. 在类中定义一个属性时,如果希望这个属性只能被读取而不能被修改,可以使用@property装饰器把这个属性转换成只读属性。

  2. 如果希望在访问一个属性时自动执行一些额外的代码(例如数据校验等),也可以使用@property装饰器。

  3. 如果希望动态计算一个属性的值而不需要在类中定义一个对应的实例变量,也可以使用@property装饰器。

虽然@property非常方便,但是在使用时也容易出现一些问题,例如报"TypeError: 'property' object is not callable "的错误。这个错误的原因是因为在代码中把@property当成了函数来调用。

下面是一个简单的例子,演示了如何使用@property装饰器来定义只读属性:

class Rectangle:
    def __init__(self, width, height):
        self._width = width
        self._height = height

    @property
    def area(self):
        return self._width * self._height

    @property
    def perimeter(self):
        return 2 * (self._width + self._height)

r = Rectangle(10, 20)
print(r.area)       # 200
print(r.perimeter)  # 60

r.area = 100  # AttributeError: can't set attribute

这段代码定义了一个矩形类,里面包含了宽度和高度两个属性,还定义了两个只读属性area和perimeter,分别计算矩形的面积和周长。当我们使用r.area和r.perimeter来访问这两个属性时,会自动执行对应的方法,返回计算结果。

现在,假设我们想要动态地修改这个矩形的宽度和高度,然后重新计算面积和周长,我们可以添加以下代码:

r.width = 30
r.height = 40
print(r.area)       # 1200
print(r.perimeter)  # 140

这段代码似乎没什么问题,但是运行时却会抛出"TypeError: 'property' object is not callable "的异常。这是因为我们在定义矩形对象时,并没有定义对应的width和height属性,所以Python会尝试去调用@property装饰器内部定义的getter函数来获取它们的值。但是由于这些属性并不存在,所以Python会抛出异常。

那么该怎么解决这个问题呢?我们可以在类中添加以下两个方法来定义width和height属性的setter函数:

class Rectangle:
    def __init__(self, width, height):
        self._width = width
        self._height = height

    @property
    def width(self):
        return self._width

    @width.setter
    def width(self, value):
        self._width = value

    @property
    def height(self):
        return self._height

    @height.setter
    def height(self, value):
        self._height = value

    @property
    def area(self):
        return self._width * self._height

    @property
    def perimeter(self):
        return 2 * (self._width + self._height)

r = Rectangle(10, 20)
print(r.area)       # 200
print(r.perimeter)  # 60

r.width = 30
r.height = 40
print(r.area)       # 1200
print(r.perimeter)  # 140

这次,我们在类中定义了width和height属性的setter函数,使得我们可以动态地修改这两个属性的值。当我们使用r.width和r.height来访问这两个属性时,会自动调用相应的getter和setter函数。

总结一下,报"TypeError: 'property' object is not callable "的错误通常是因为在代码中将@property当成了函数来调用所致。为了避免这种错误,我们可以使用@property装饰器来定义属性,并且在需要动态修改属性时,在类中添加setter函数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python报”TypeError: ‘property’ object is not callable “的原因以及解决办法 - Python技术站

(0)
上一篇 2023年3月14日
下一篇 2023年3月14日

相关文章

合作推广
合作推广
分享本页
返回顶部