是否可以声明一个类变量,它将产生两个其他类变量的总和

时间:2017-05-10 00:30:44

标签: python oop

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

3 个答案:

答案 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.refself.ask当前值,并在此行执行时立即将它们加在一起。更改self.addedself.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)