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 方法:foo1
、foo2
, 等等?
问题是您创建的是 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
或调用 bar
或 baaz
时都希望执行 x = somefunc()
语句?
考虑以下因素:
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 方法:foo1
、foo2
, 等等?
问题是您创建的是 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
或调用 bar
或 baaz
时都希望执行 x = somefunc()
语句?