更改Python类变量值

时间:2018-04-13 08:12:46

标签: python

我是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)

6 个答案:

答案 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
    )

Static class variables in Python

答案 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是一个方便的装饰器,它允许您将地址secondsmsg作为属性,但始终会同步并保持一致:首先,您无法设置{ {1}}属性,因此受到保护。其次,更改seconds会影响对agemsg的所有后续调用。

使用示例:

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'}