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