说我有课:
class Foo(object):
def __init__(self):
self.some_attr = ''
self.a_list = []
self.empty_check = bool(self.a_list)
myFoo = Foo()
myFoo.a_list.append(1)
与this user非常相似,我希望empty_check
可以自行更改为True
,只要将某些内容附加到列表中,我就无需执行任何其他操作。如上所述,myFoo.empty_check
仍为False
。但是,我希望我的某种方式去#34;。也就是说,我不希望myFoo.empty_check = True
将myFoo.a_list
更改为[]
。 (技术上不重复,对吗?)
我该如何做到这一点?
似乎我应该使用属性制定者,但是尽管谷歌搜索了几个小时,包括阅读相关问题,我仍然不明白如何做到这一点。
答案 0 :(得分:1)
您应该使用property
,每次尝试访问该属性时都会对该属性进行评估,因此您最终会检查最新的self.a_list
。此外,如果您只为该属性指定getter,而没有setter,则无法执行 - myFoo.empty_check = True
等。示例 -
class Foo(object):
def __init__(self):
self.some_attr = ''
self.a_list = []
@property
def empty_check(self):
return bool(self.a_list)
myFoo = Foo()
print(myFoo.empty_check)
myFoo.a_list.append(1)
print(myFoo.empty_check)
示例/演示 -
>>> class Foo(object):
... def __init__(self):
... self.some_attr = ''
... self.a_list = []
... @property
... def empty_check(self):
... return bool(self.a_list)
...
>>> myFoo = Foo()
>>> print(myFoo.empty_check)
False
>>> myFoo.a_list.append(1)
>>> print(myFoo.empty_check)
True
>>> myFoo.empty_check = True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
答案 1 :(得分:1)
这应该这样做(我改变了一些事情以遵循更好的做法):
class Foo(object):
def __init__(self):
self.some_attr = ''
self.a_list = []
@property
def is_empty(self):
return not self.a_list
演示:
>>> my_foo = Foo()
>>> print(my_foo.is_empty)
True
>>> my_foo.a_list.append(1)
>>> print(my_foo.is_empty)
False
>>> my_foo.is_empty = True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
>>>
property
本质上为您提供了访问属性值的语法,而在幕后调用方法。属性不仅仅是为了获得价值;您也可以使用它们进行设置和删除。有关详细信息,请参阅the property
documentation。