首页 > 解决方案 > Getter 使用属性装饰器返回对象没有属性

问题描述

下面的代码返回AttributeError: 'Circle' object has no attribute 'r'。我已经重读了很多遍,但看不到我遗漏了什么。你可以吗?

class Circle():

    # Constructor
    def __init__(self, radius):

        # Control argument, raise an error(message) if <= 0
        if radius <= 0:
            raise ValueError('Invalid argument')

        # private instance variable
        self.__r = radius

        # Getter
        @property
        def r(self):
            return self.__r

        # Setter
        @r.setter
        def r(self, radius):
            if radius >= 0:
                self.__r = radius
            else:
                raise ValueError('Radius must be larger than 0')


c = Circle(5)
print(c.r) # >> AttributeError: 'Circle' object has no attribute 'r'

标签: python

解决方案


属性缩进是错误的,因为它当前是在init中定义的。

class Circle:

    # Constructor
    def __init__(self, radius):

        # Control argument, raise an error(message) if <= 0
        if radius <= 0:
            raise ValueError('Invalid argument')

        # private instance variable
        self.__r = radius

    # Getter
    @property
    def r(self):
        return self.__r

    # Setter
    @r.setter
    def r(self, radius):
        if radius >= 0:
            self.__r = radius
        else:
            raise ValueError('Radius must be larger than 0')

推荐阅读