Class 没有 __init__ 的 class 内的变量赋值

Class variable assignment inside a class without __init__

考虑以下因素:

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 class 变量是 而不是 再次被赋值是真的吗对 foo_ext() 的调用,仅在第一次调用 "static class" A 时使用其某些 class 方法:foo1foo2, 等等?

问题是您创建的是 class 属性,而不是实例属性。

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 一次。 - 因为 class 属性不会在您每次调用 class 时重建,而是在执行时重建一次。

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

Is it true that everytime we call A.foo1() or A.foo2() x class variable is not being assigned again by a call to foo_ext()

当然可以,为什么???

only on the first time there is some call to "static class" A with some of its class methods :foo1, foo2, etc?

甚至没有。这个语句 - 就像 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() 语句?