Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以声明一个类变量,该类变量将产生另外两个类变量之和_Python_Oop - Fatal编程技术网

Python 是否可以声明一个类变量,该类变量将产生另外两个类变量之和

Python 是否可以声明一个类变量,该类变量将产生另外两个类变量之和,python,oop,Python,Oop,我想print(inst.added)返回12,但它返回0最简单的方法是将added作为一个方法并调用它: 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

我想
print(inst.added)
返回12,但它返回0

最简单的方法是将
added
作为一个方法并调用它:

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)
或者,您可以将
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
>>>

执行
self.added=self.ref+self.ask
时,将获取
self.ref
self.ask
当前值,并在此行执行时立即将它们相加<当您更改
self.ref
self.ask
时,将不会更新code>self.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
>>>

实际上,名称为
\uuuuu init\uuuu
的方法是在创建类之后调用的(cf
\uuuuu new\uuuu
)。也就是说当你这么做的时候

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)
inst.added
已经等于
0
以后做的任何事情

您可以做的事情是定义另一个方法,该方法在需要时(以及在实例化之后)执行您需要的操作。例如

最后

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
但是,请记住,即使您可以访问
added
作为一个公共属性,如果您尝试直接设置它(在Python 2中以及在版本3中),也会得到一个错误,即

返回以下错误

>>> inst.added = 15
回溯(最近一次呼叫最后一次):
文件“”,第YY行,在
增加的仪器=15
AttributeError:无法设置属性

通常,在Python中,不使用getter和setter。@juanpa.arrivillaga是的,您的
@property
解决方案更像Python。请注意术语:这些是实例变量,而不是类变量。类变量的值将在类的所有实例之间共享,并且不太常用。
>>> 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
>>> inst.added = 15
Traceback (most recent call last):
  File "<pyshell#XX>", line YY, in <module>
    inst.added = 15
AttributeError: can't set attribute