【问题标题】: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 及其一些类方法:foo1、foo2 等?
【问题讨论】:
标签:
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 或调用 bar 或 baaz 时都会执行 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__?或将类属性更改为属性?或者更好的是,只需在需要时调用该函数?