【问题标题】:Class variable assignment inside a class without __init__没有 __init__ 的类中的类变量赋值
【发布时间】:2019-03-26 08:44:39
【问题描述】:

考虑以下几点:

from module1 import foo_ext()

    class A(object):
        x = foo_ext()
        @classMethod
        def foo1():
          . . .
        @classMethod
        def foo2():
          . . .
        @classMethod
        def foo3():
          . . .

真的每次我们调用A.foo1()A.foo2()x 类变量不会通过调用foo_ext() 再次分配,只是第一次有一些调用“静态类”A 及其一些类方法:foo1foo2 等?

【问题讨论】:

    标签: python python-3.x class-variables


    【解决方案1】:

    是不是每次我们调用 A.foo1() 或 A.foo2() x 类变量都不会通过调用 foo_ext() 再次分配

    嗯,是的,为什么?

    仅在第一次调用“静态类”A 及其一些类方法:foo1、foo2 等?

    甚至没有。该语句 - 与 class 块顶层的所有语句一样 - 作为 class 语句执行的一部分进行评估,这是 - 假设模块顶部的 class 语句的最常见情况 -级别(=> 不在函数内)- 首次为给定进程导入模块时。

    这个:

    class Foo(object):
       x = somefunc()
    
       def bar(self):
           print("foo")
    
       @staticmethod
       def baaz():
           print("quux")
    

    实际上只是语法糖:

    x = somefunc()
    
    def bar(self):
      print("foo")
    
    def baaz():
       print("quux")
    
    attribs = {
        "x" : x,
        "bar": bar,
        "baaz": staticmethod(baaz)
        }
    
    del x
    del bar
    del baaz
    
    Foo = type("Foo", (object,), attribs)
    

    那么为什么您希望每次实例化 Foo 或调用 barbaaz 时都会执行 x = somefunc() 语句?

    【讨论】:

      【解决方案2】:

      问题在于您创建的是类属性而不是实例属性。

      def in_here():
          print('Called')
      
          return True
      
      class A:
          x = in_here()
      
          @classmethod
          def test(cls):
              print('In test')
              return cls.x
      
      
      A.test()
      

      这只会打印一次Called。 - 因为类属性不是在每次调用类时都重建,而是在执行时重建一次。

      如果您想让它运行不止一次,那么为什么不使用__init__?或将类属性更改为属性?或者更好的是,只需在需要时调用该函数?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多