请考虑以下内容:
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
进行一些调用:foo1
,foo2
等?
答案 0 :(得分:3)
是不是每次调用A.foo1()或A.foo2()x都不会通过调用foo_ext()再次分配类变量
当然可以,为什么???
仅在第一次使用其某些类方法:foo1,foo2等对“静态类” A进行调用时?
甚至没有。像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)
那么为什么您希望每次实例化x = somefunc()
或调用Foo
或bar
时都执行baaz
语句?
答案 1 :(得分:1)
问题在于您正在创建类属性而不是实例属性。
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__
?或将class属性更改为属性?还是更好,只是在需要时调用该函数?