首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类__init__ (非实例__init__)

类__init__ (非实例__init__)
EN

Stack Overflow用户
提问于 2010-04-24 22:32:30
回答 5查看 571关注 0票数 8

这里有一个非常简单的例子来说明我想要做的事情:

代码语言:javascript
运行
复制
class Test(object):
    some_dict = {Test: True}

问题是我不能在测试还在定义的时候引用它

一般情况下,我只会这样做:

代码语言:javascript
运行
复制
class Test(object):
    some_dict = {}
    def __init__(self):
        if self.__class__.some_dict == {}:
            self.__class__.some_dict = {Test: True}

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

因此,我的问题是,在定义测试时,我如何引用它,或者在定义类时,是否有类似于__init__的调用?如果可能的话,我希望self.some_dict = {Test: True}留在类定义中。到目前为止,这是我唯一知道如何做到这一点的方法:

代码语言:javascript
运行
复制
class Test(object):
    @classmethod
    def class_init(cls):
        cls.some_dict = {Test: True}
Test.class_init()
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-04-24 22:41:58

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

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

如果您真的希望它是一个类,那么您有三个选项:在定义类之后设置dict:

代码语言:javascript
运行
复制
class Test:
    some_dict = {}
Test.some_dict[Test] = True

使用类装饰器(在Python2.6或更高版本中):

代码语言:javascript
运行
复制
def set_some_dict(cls):
    cls.some_dict[cls] = True

@set_some_dict
class Test:
    some_dict = {}

或者使用元类:

代码语言:javascript
运行
复制
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 = {}
票数 12
EN

Stack Overflow用户

发布于 2010-04-24 22:38:15

您可以在主类定义之后添加some_dict属性。

代码语言:javascript
运行
复制
class Test(object):
  pass
Test.some_dict = {Test: True}
票数 4
EN

Stack Overflow用户

发布于 2012-06-07 08:32:12

我过去曾尝试过以这种方式使用类,但它很快就变得丑陋起来(例如,所有方法都需要类方法或静态方法,您可能最终会意识到,您想要定义某些特殊的方法,为此您必须开始使用元类)。如果您只使用类实例,它可能会使事情变得更简单--实际上没有什么坏处。

(看起来很奇怪的)替代其他人的建议:您可以使用__new__

代码语言:javascript
运行
复制
class Test(object):
    def __new__(cls):
        cls.some_dict = {cls: True}

Test()

您甚至可以让__new__返回对类的引用,并使用装饰器调用它:

代码语言:javascript
运行
复制
def instantiate(cls):
    return cls()

@instantiate
class Test(object):
    def __new__(cls):
        cls.some_dict = {cls: True}
        return cls
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2706408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档