以下是Java代码。我需要知道Python中等价的代码:
class A {
public static A obj = new A();
}
以下是Java代码。我需要知道Python中等价的代码:
class A {
public static A obj = new A();
}
在Python类定义中,你不能这样做,因为直到class:
块结束前,该类才被定义。你必须在之后设置它:
class A(object):
pass
A.obj = A()
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 在评论中指出的那样,解决你所面临的问题可能有一种更加简单、更具Pythonic的方法。 在考虑了这个评论之后,如果不是在对象结构上完全相同,你可以通过拥有类似于以下模块的方式来实现相同的功能:
a.py
class A(object):
@property
def obj(self):
return a_inst
a_inst = A()
这确实在使用它的代码中创建了有点丑陋的结构from a import A
,但这是一种更简单的实现方式。
cls.obj = cls()
或者我答案中的 property
东西更喜欢它们,因为我真的讨厌 from a import A
结构的冗余。虽然更常见的情况是,通过调整实现并将类推到层次结构的上一级或两级,您可以避免这两个问题。 - Silas Raya
中定义class A(object): pass
,并且obj
应该是a.obj
,否则我看不出与我的代码相比有任何优势。 - jamylaka_inst
可以被视为类的实现细节,而A.obj
是不可分配的。当然,它的缺点是无法从类中访问,但您可以使用描述符或元类来解决这个问题。 - Silas Ray在创建类的任何实例之前,您需要这个类成员吗?如果不需要,您可以尝试在创建第一个实例时进行赋值:
class A (object):
obj = None
def __init__(self):
if A.obj is None:
a.obj = A()
# or:
a.obj = self
__new__
中更早地完成它。 - Silas Ray我认为你想这样做是因为你正在尝试实现单例模式或类似的模式。
你可以从 activestate 阅读以下配方:http://code.activestate.com/recipes/52558/
它解释了它的工作原理,并展示了一些代码。