我是Python的新手(来自JavaScript),我正在努力了解如何更改类变量的值。我要做的就是更改年龄值,然后显示新的msg
。但是当我添加Tester.age = 20
时,它不会更改我的msg
输出。我的msg
输出仍然使用age = 10
。
如何在外部更改类变量?
class ClassTester:
age = 10
seconds = age * 365 * 24 * 60 * 60
msg = "You have lived for " + str(seconds) + " seconds."
Tester = ClassTester()
Tester.age = 20
print(Tester.msg)
答案 0 :(得分:1)
我建议使用属性,因此您的界面不会改变。
class ClassTester:
def __init__(self):
self._age = 10
self._msg = "You have lived for {} seconds."
self._secs = self._seconds(self._age)
@staticmethod
def _seconds(age):
return age * 365 * 24 * 60 * 60
@property
def age(self):
return self._age
@age.setter
def age(self, v):
self._age = v
self._secs = self._seconds(v)
@property
def msg(self):
return self._msg.format(self._secs)
Tester = ClassTester()
print(Tester.msg) # You have lived for 315360000 seconds.
Tester.age = 20
print(Tester.msg) # You have lived for 630720000 seconds.
修改强>
我添加了一个静态方法来重新计算秒值,并从__init__
和年龄设置器调用它来减少重新计算,根据OP对另一个答案的评论中的那些关注
答案 1 :(得分:0)
你做错了,
你将msg
var定义为类的属性,并且它已被评估过一次,(当你实例化该类时)并且没有更改,
所以当你打电话时:
print(Tester.msg)
你得到第一个值,
与您的工作最接近的是将msg
简化为方法,只需:
class ClassTester:
age = 10
seconds = self.age * 365 * 24 * 60 * 60
msg = "You have lived for " + str(seconds) + " seconds."
def get_msg(self):
seconds = self.age * 365 * 24 * 60 * 60
self.msg = "You have lived for " + str(seconds) + " seconds."
Tester = ClassTester()
Tester.age = 20
Tester.get_msg()
print(Tester.msg)
答案 2 :(得分:0)
age是静态类变量 您可以使用类名
直接访问年龄变量[0] => stdClass Object
(
[id] => 6
[value] => A Item
)
[1] => stdClass Object
(
[id] => 3
[value] => B Item
)
[2] => stdClass Object
(
[id] => 1
[value] => C Item
)
[3] => stdClass Object
(
[id] => 10
[value] => D Item
)
答案 3 :(得分:0)
解决方案是将变量设置在对象级(而不是类级)中。您可以通过在init区域内创建变量来完成此操作,如下所示。然后,您可以在外部更改值。
然后你需要使用该变量计算你想要的不同函数。然后只需在需要的地方调用该函数。
非常重要(我犯的错误):init写有两个下划线_ x 2每侧
class ClassTester:
def __init__(self):
self.age = 10
def msg(self):
self.seconds = self.age * 365 * 24 * 60 * 60
self.txt = "You have lived for " + str(self.seconds) + " seconds."
return self.txt
Tester = ClassTester()
Tester.age = 20
print(Tester.msg())
Tester.age = 30
print(Tester.msg())
答案 4 :(得分:0)
首先,正如评论中指出的那样,您应该在__init__
构造函数中声明变量。至于您的示例,我建议您制作一些更高级的步骤,因此请考虑以下事项:您实际上只有一个重要的变量,即self.age
。其他所有内容都是从它派生的,因此您可能会失去一致性:例如,在更改self.age
时,其他变量将不会更改。此外,您可以稍后在项目中更改self.seconds
变量,从而完全搞乱您的类实例。要解决这个问题,请查看property
装饰器:
class ClassTester:
def __init__(self, age=10):
self.age = age
@property
def seconds(self):
return self.age * 365 * 24 * 60 * 60
@property
def msg(self):
return "You have lived for {} seconds.".format(self.seconds)
在那里,@property
是一个方便的装饰器,它允许您将地址seconds
和msg
作为属性,但始终会同步并保持一致:首先,您无法设置{ {1}}属性,因此受到保护。其次,更改seconds
会影响对age
和msg
的所有后续调用。
使用示例:
seconds
关于>>> tester = ClassTester()
>>> tester.seconds
315360000
>>> tester.msg
'You have lived for 315360000 seconds.'
>>> tester.age = 23
>>> tester.seconds
725328000
>>> tester.msg
还有很多,请随时探索!例如,请参阅this answer进行一些深入的@property
分析。
答案 5 :(得分:0)
老问题,但仍然值得一个新答案。
OP似乎希望以某种方式更改类变量的值,以使该类的所有对象都可以感觉到更改。
您不能直接更改类变量的值,但是如果类变量的值是可变对象,则可以更改该对象的内容,并且更改将在所有实例中出现。班级。
class A:
my_magic = dict()
a = A()
b = A()
c = A()
a.my_magic['x'] = "something"
b.my_magic['y'] = "other thing"
print(c.my_magic)
results
{'x': 'something', 'y': 'other thing'}