Python类的静态初始化程序

时间:2017-12-13 13:42:29

标签: python python-3.x class static

我正在寻找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

但是这个解决方案相当丑陋,因为我在类上下文之外更改了一个类的静态字段,如果该类包含很多代码,那么很容易错过这里发生的事情。

所以基本上我需要一种在初始化类之后立即调用函数的方法,并且我想在类中定义这个函数。

3 个答案:

答案 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)