【发布时间】:2023-03-17 02:07:01
【问题描述】:
你是怎么想出这个有趣的(至少对我来说)例子的。
import numpy as np
class Something(object):
a = np.random.randint(low=0, high=10)
def do(self):
self.a += 1
print(self.a)
if __name__ == '__main__':
something = Something()
print(something.__str__())
something.do()
something2 = Something()
print(something2.__str__())
something2.do()
something3 = Something()
print(something3.__str__())
something3.do()
以上在控制台中打印以下内容:
$ python test.py
<__main__.Something object at 0x7f03a80e0518>
1
<__main__.Something object at 0x7f03a80cfcc0>
1
<__main__.Something object at 0x7f03a80cfcf8>
1
我有点困惑,因为我(错误地)假设a 的值会增加。
如果我使用 @classmethod 装饰器,我可以获得预期的行为。
import numpy as np
class Something(object):
a = np.random.randint(low=0, high=10)
@classmethod
def do(cls):
cls.a += 1
print(cls.a)
if __name__ == '__main__':
something = Something()
print(something.__str__())
something.do()
something2 = Something()
print(something2.__str__())
something2.do()
something3 = Something()
print(something3.__str__())
something3.do()
这会在控制台中正确打印以下内容。
python test.py
<__main__.Something object at 0x7faac77becc0>
3
<__main__.Something object at 0x7faac77becf8>
4
<__main__.Something object at 0x7faac77c3978>
5
现在,我想知道在第一个示例中,当我调用 self.a 时,我正在访问什么?它不是一个类变量,因为我似乎无法改变它的值。它也不是实例变量,因为它似乎在同一类的不同对象之间共享。你怎么称呼它?
这是我以错误方式使用的类变量吗?如果约定,我知道 cls 名称,所以也许我真的在访问一个类变量,但我无法更改它的值,因为我没有使用 @classmethod 装饰器装饰方法。
这是对语言的一种非法使用吗?我的意思是最好不要这样做以避免在后期引入错误?
【问题讨论】:
-
好,内容丰富的问题!但是您能否编辑问题的第一行“我如何想出这个有趣的(至少对我而言)示例”。让人们能理解吗?
标签: python python-3.x instance-variables class-variables