【问题标题】: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
          

          【讨论】:

            猜你喜欢
            • 2016-02-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-08
            • 2012-06-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多