这里有一个非常简单的例子来说明我想要做的事情:
class Test(object):
some_dict = {Test: True}
问题是我不能在测试还在定义的时候引用它
一般情况下,我只会这样做:
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}
留在类定义中。到目前为止,这是我唯一知道如何做到这一点的方法:
class Test(object):
@classmethod
def class_init(cls):
cls.some_dict = {Test: True}
Test.class_init()
发布于 2010-04-24 22:41:58
实际上,在定义类时,类并不存在。class
语句的工作方式是,语句的主体作为代码块在单独的命名空间中执行。在执行结束时,名称空间被传递给元类(如type
),元类使用名称空间作为属性空间创建类。
根据您的描述,测试作为类听起来并不是必要的。听起来应该是个模块。some_dict
是一个全局属性--即使它是一个类属性,程序中也只有一个这样的属性,所以它并不比拥有一个全局属性更好--类中的任何类方法都可以是函数。
如果您真的希望它是一个类,那么您有三个选项:在定义类之后设置dict:
class Test:
some_dict = {}
Test.some_dict[Test] = True
使用类装饰器(在Python2.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 = {}
发布于 2010-04-24 22:38:15
您可以在主类定义之后添加some_dict属性。
class Test(object):
pass
Test.some_dict = {Test: True}
发布于 2012-06-07 08:32:12
我过去曾尝试过以这种方式使用类,但它很快就变得丑陋起来(例如,所有方法都需要类方法或静态方法,您可能最终会意识到,您想要定义某些特殊的方法,为此您必须开始使用元类)。如果您只使用类实例,它可能会使事情变得更简单--实际上没有什么坏处。
(看起来很奇怪的)替代其他人的建议:您可以使用__new__
。
class Test(object):
def __new__(cls):
cls.some_dict = {cls: True}
Test()
您甚至可以让__new__
返回对类的引用,并使用装饰器调用它:
def instantiate(cls):
return cls()
@instantiate
class Test(object):
def __new__(cls):
cls.some_dict = {cls: True}
return cls
https://stackoverflow.com/questions/2706408
复制相似问题