gpt4 book ai didi

Python 类构造函数(静态)

转载 作者:行者123 更新时间:2023-12-02 20:42:58 30 4
gpt4 key购买 nike

Python 是否有类构造函数的机制,即每当首次引用类时(而不是创建该对象的实例时)调用的函数?我知道其他一些语言中也存在这种情况,但我还没有在 Python 中遇到过。

基本上,我想初始化该函数中的一些静态属性。我在下面举了一个我所期望的例子。当然,该示例返回 None,但我希望它返回 'foo'。

class T:
arg = None
def __class_constructor__():
T.arg = 'foo'

print(T.arg) # returns None

为了避免混淆:我很清楚对象构造函数,但这不是我想要的,因为它仅在第一个对象创建后调用,而不是在此之前:

class T:
arg = None
def __init__(self):
type(self).arg = 'foo'

print(T.arg) # returns None
obj = T()
print(T.arg) # returns 'foo'

最佳答案

您可以使用类装饰器:

def add_arg(cls):
if not hasattr(cls, "arg"):
cls.arg = 'foo'
return cls

@add_arg
class T(object):
pass

或者自定义元类:

class WithArg(type):
def __new__(meta, name, bases, attrs):
cls = type.__new__(meta, name, bases, attrs)
if not hasattr(cls, "arg"):
cls.arg = "foo"
return cls

# python 2
class T(object):
__metaclass__ = WithArg

# python 3
class T(metaclass=WithArg):
pass

但正如其他人已经提到的那样,这只会给您带来比在类语句中简单地设置类属性更多的信息。

注意:如果您想要类本身的计算属性,则必须将其设置为自定义元类的属性

 class WithProp(type):
@property
def arg(cls):
return "foo"

class T(object):
__metaclass__ = WithProp

T.arg
=> 'foo'

但是 arg 只能在类对象本身上可用,而不能在其实例上使用:

T().arg
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'T' object has no attribute 'arg'

或编写您自己的自定义描述符:

class ArgDescriptor(object):
def __get__(self, obj, cls=None):
return 42

class T(object):
arg = ArgDescriptor()

T.arg
=> 42
T().arg
=> 42

关于Python 类构造函数(静态),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45505605/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com