以下是java代码。我需要知道python中的等效代码:
class A {
public static A obj = new A();
}
答案 0 :(得分:6)
你不能在python类定义中执行此操作,因为在class:
块结束之前尚未定义类。你必须在以下之后进行设置:
class A(object):
pass
A.obj = A()
答案 1 :(得分:4)
你可以用元类来做到这一点:
class SelfReferencingObjectMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs['obj'] = property(lambda self: self.__class__.obj)
return super(SelfReferencingObjectMetaclass, cls).__new__(cls, name, bases, attrs)
@property
def obj(cls):
try:
return cls._obj
except AttributeError:
cls._obj = cls()
return cls._obj
class A(object):
__metaclass__ = SelfReferencingObjectMetaclass
正如@Daniel Roseman在@ jamylak的回答评论中指出的那样,可能有一种更简单,更Pythonic的方式来解决你遇到的问题。在那个评论之后,如果在对象结构方面不完全相同的话,你将如何在功能上实现这一目标,那就是拥有这样的模块:
a.py
class A(object):
@property
def obj(self):
return a_inst
a_inst = A()
这确实在使用它的代码中创建了一些有点丑陋的构造from a import A
,但它实现起来却不那么复杂。
答案 2 :(得分:1)
在创建类的任何实例之前,您是否需要此类成员?如果没有,您可以尝试在创建第一个实例时进行分配:
class A (object):
obj = None
def __init__(self):
if A.obj is None:
a.obj = A()
# or:
a.obj = self
答案 3 :(得分:0)
我认为你喜欢这样做,因为你正试图实现像单身人士这样的模式。
您可以从activestate阅读以下食谱:http://code.activestate.com/recipes/52558/
它解释了它的工作方式,并展示了一些代码。