我正在寻找Java中可用于Python类的static { ... }
块的等价物。具体来说,我希望能够访问静态资源,如类构造函数的参数,并将它们存储在类的字段中,如下所示:
class A:
constructor_args = A.__init__.__code__.co_varnames
def __init__(self, foo=0, bar=1):
...
这个例子不起作用,因为当我呼叫A.__init__.__code__.co_varnames
时,A类尚未初始化。
我目前的解决方法是在创建类之后更改静态字段,如下所示:
class A:
constructor_args = ...
def __init__(self, foo=0, bar=1):
...
constructor_args = A.__init__.__code__.co_varnames
但是这个解决方案相当丑陋,因为我在类上下文之外更改了一个类的静态字段,如果该类包含很多代码,那么很容易错过这里发生的事情。
所以基本上我需要一种在初始化类之后立即调用函数的方法,并且我想在类中定义这个函数。
答案 0 :(得分:1)
您必须首先至少定义__init__
方法,但您可以在以下后立即访问其属性:
class Foo:
def __init__(self, bar, baz):
pass
constructor_args = __init__.__code__.co_varnames
class
块代码内部在其自己的命名空间内执行,因此__init__
可以__init__
直接访问。
答案 1 :(得分:1)
这是一种简单的方法,通过在类体内定义的函数内移动它来推迟执行需要完成的类的代码。要在使用后调用和删除函数,我们定义一个简单的装饰器:
import inspect
def finalizing(cls):
cls.__finalize__(cls)
del cls.__finalize__
return cls
@finalizing
class example:
def __finalize__(me):
me.constructor_args = list(inspect.signature(me.__init__).parameters)
def __init__(self, x):
pass
example.constructor_args
# ['self', 'x']
答案 2 :(得分:0)
您可以使用class decorator:
def store_constructor_args(cls):
cls.constructor_args = cls.__init__.__code__.co_varnames
return cls
@store_constructor_args
class A:
def __init__(self, foo=0, bar=1):
x = 10
print(A.constructor_args)
# ('self', 'foo', 'bar', 'x')
@store_constructor_args
class A:
相当于
class A:
...
A = store_constructor_args(A)