gpt4 book ai didi

python - __init__ 类(不是实例 __init__)

转载 作者:太空狗 更新时间:2023-10-29 20:41:20 27 4
gpt4 key购买 nike

这是我试图解决的一个非常简单的例子:

class Test(object):
some_dict = {Test: True}

问题是我无法在 Test 仍在定义时引用它

通常,我会这样做:

class Test(object):
some_dict = {}
def __init__(self):
if self.__class__.some_dict == {}:
self.__class__.some_dict = {Test: True}

但我从未创建此类的实例。它实际上只是一个容纳一组相关函数和数据的容器(我有几个这样的类,我传递了对它们的引用,所以 Test 有必要成为它自己的类)

所以我的问题是,我如何在定义 Test 时引用它,或者是否有类似于 __init__ 的东西在定义类时立即调用?如果可能,我希望 self.some_dict = {Test: True} 保留在类定义中。到目前为止,这是我知道如何执行此操作的唯一方法:

class Test(object):
@classmethod
def class_init(cls):
cls.some_dict = {Test: True}
Test.class_init()

最佳答案

该类在定义时实际上并不存在。 class 语句的工作方式是语句的主体作为代码块在单独的命名空间中执行。在执行结束时,该命名空间被传递给元类(例如 type),元类使用命名空间作为属性空间创建类。

根据您的描述,Test 听起来没有必须成为一个类。听起来它应该是一个模块some_dict 是一个全局的——即使它是一个类属性,在你的程序中也只有一个这样的属性,所以它并不比拥有一个全局的更好——你在类中的任何类方法都可以是函数。

如果你真的想让它成为一个类,你有三个选择:在定义类之后设置dict:

class Test:
some_dict = {}
Test.some_dict[Test] = True

使用类装饰器(在 Python 2.6 或更高版本中):

def set_some_dict(cls):
cls.some_dict[cls] = True

@set_some_dict
class Test:
some_dict = {}

或者使用元类:

class SomeDictSetterType(type):
def __init__(self, name, bases, attrs):
self.some_dict[self] = True
super(SomeDictSetterType, self).__init__(name, bases, attrs)

class Test(object):
__metaclass__ = SomeDictSetterType
some_dict = {}

关于python - __init__ 类(不是实例 __init__),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2706408/

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