Python 3.x 在课堂上正确使用属性

Python 3.x 在课堂上正确使用属性,python-3.x,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:name“listing”

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

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:name“listing”未在
\uuuu init\uuuuu
中定义,它是一个未定义的局部变量,不是对
Person
对象的
列表
属性的引用。那将是self.listing

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

看起来您正试图定义属性的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
或(使用
属性
装饰器)


谢谢Patrick,它工作得很好,但是我怎么能用我的字典初始化,而不需要以后修改呢?不要定义setter,在
中设置
self.\u listing=value
,这正是我需要的。谢谢
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}