class my_class(object):
def __init__(self):
self.ref = 0
self.ask = 0
self.added = self.ref + self.ask
inst = my_class()
inst.ref = 5
inst.ask = 7
print(inst.ref + inst.ask)
print(inst.added)
我希望print(inst.added)
返回12但它返回0
答案 0 :(得分:6)
最简单的方法是将added
作为方法并调用它:
>>> class A:
... def __init__(self):
... self.ref = 0
... self.ask = 0
... def added(self):
... return self.ref + self.ask
...
>>> a = A()
>>> a.ref = 5
>>> a.ask = 7
>>> a.added()
12
>>>
或者您可以将added
设为一个属性,让您可以像数据属性而非方法一样访问它:
>>> class A:
... def __init__(self):
... self.ref = 0
... self.ask = 0
... @property
... def added(self):
... return self.ref + self.ask
...
>>> a = A()
>>> a.ref = 5
>>> a.ask = 7
>>> a.added
12
>>>
答案 1 :(得分:1)
实际上,在创建类之后调用名称为__init__
的方法(cf __new__
)。这意味着当你做
inst = my_class()
无论你以后做什么, inst.added
已经等于0
。
你可以做的是定义另一种方法,在你需要它时做你需要的(在实例化之后)。 E.g。
class my_class(object):
def __init__(self):
self.ref = 0
self.ask = 0
@property
def added(self):
return self.ref + self.ask
def add(self):
return self.ref + self.ask
最后
>>> inst = my_class()
>>> inst.ref = 5
>>> inst.ask = 7
>>> inst.added # briefly, the property decorator does the job of calling the callable for you
12
>>> inst.add() # while here, you do call the callable
12
>>> inst.ref = 7
>>> inst.added
14
>>> inst.add()
14
但是,请记住,即使您可以作为公共属性访问added
,如果您尝试直接设置它(在Python 2和版本3中),也会出现错误,即< / p>
>>> inst.added = 15
返回以下错误
Traceback (most recent call last):
File "<pyshell#XX>", line YY, in <module>
inst.added = 15
AttributeError: can't set attribute
答案 2 :(得分:0)
执行self.added = self.ref + self.ask
时,会获取self.ref
和self.ask
的当前值,并在此行执行时立即将它们加在一起。更改self.added
或self.ref
后,系统不会更新self.ask
。相反,您需要在类中创建一个函数来设置这些值:
class my_class(object):
def __init__(self):
self.ref = 0
self.ask = 0
self.added = self.ref + self.ask
def set_ref(self, value):
self.ref = value
self.added = self.ref + self.ask
inst = my_class()
inst.set_ref(5)
print(inst.added)