基于python 3中另一个属性的值进行更新的属性

时间:2015-08-12 00:46:25

标签: python class attributes

说我有课:

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 = TruemyFoo.a_list更改为[]。 (技术上不重复,对吗?)

我该如何做到这一点?

似乎我应该使用属性制定者,但是尽管谷歌搜索了几个小时,包括阅读相关问题,我仍然不明白如何做到这一点。

2 个答案:

答案 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