在课堂上善用财产

时间:2018-12-13 15:20:03

标签: python-3.x

您能解释一下我为什么这个简单的属性不起作用吗?

class Person:
    def __init__(self):
        self.person = listing
    def _set_listing(self):
        self._listing = {'a':'ok','b':'no','c':'yes'}
    listing = property(_set_listing)

i=Person()

返回错误 NameError:未定义名称“列表”

1 个答案:

答案 0 :(得分:1)

listing中的

__init__是未定义的局部变量,不是对listing对象的Person属性的引用。那将是self.listing

您的属性有一个不返回任何内容的吸气剂,因此它隐式返回None,因此Person().listing将是None。我认为那不是你想要的。

您似乎正在尝试定义属性的setter方法,就像

class Person:
    def __init__(self):
        self.listing = 1
    def _set_listing(self, value):
        self._listing = {'a':'ok','b':'no','c':'yes', 'value': value}
    def _get_listing(self):
        return self._listing
    listing = property(_get_listing, _set_listing)

print(Person().listing['value'])  # 1

或(使用property装饰器)

class Person:
    def __init__(self):
        self.listing = 1
    @property
    def listing(self):
        return self._listing
    @listing.setter
    def listing(self, value):
        self._listing = {'a':'ok','b':'no','c':'yes', 'value': value}