【问题标题】:Python: Why does class variable get assigned?Python:为什么要分配类变量?
【发布时间】:2018-02-05 04:02:43
【问题描述】:
这是我的代码:
class MyClass:
def __init__(self):
self.value = 0
def set_value(self, value):
self.value = 5
def get_value(self):
return self.value
value = print("Hello")
a = MyClass()
输出是:
Hello
我不明白为什么print("Hello") 会被执行。当我创建类的实例时,只有实例变量设置为 0。为什么 self.value = 0 调用 value = print("Hello")?
有人可以解释一下这种行为吗?
【问题讨论】:
标签:
python
oop
properties
instance-variables
class-variables
【解决方案1】:
它没有。执行该打印是因为它本身处于类级别;类的主体在定义类时执行。即使您从未实例化 MyClass,您也会得到该输出。
【解决方案2】:
它没有,删除a = MyClass(),它无论如何都会打印"Hello"。当一个类被定义时,它会在 body 中执行代码:
class MyClass:
print(2 * 2)
# prints 4
【解决方案3】:
不要让缩进欺骗你。 value 不是实例变量。 value 是一个类变量,因为它是在类的作用域中定义的。和做的一样:
class MyClass:
value = print("Hello")
....
这意味着对print 的调用将在类定义时间运行。换句话说,当 Python 定义MyClass 时,它还定义了所有的类级别变量——包括value。为了定义值,它会调用print,这就是为什么在创建MyClass 实例之前打印Hello。
如果您只希望 MyClass 的实例打印 Hello,请将变量定义放在类构造函数中。
旁注:print 函数返回None,因此将值分配给变量似乎有点奇怪。也许您正在寻找类似input 的东西?
【解决方案4】:
代码在您执行时评估类,并调用print 来定义类变量value。
下面的例子显示它是在实例化之前打印出来的。
class MyClass:
def __init__(self):
self.value = 0
def set_value(self, value):
self.value = 5
def get_value(self):
return self.value
value = print("Hello")
print('hi')
a = MyClass()
#output
>>> Hello
>>>hi