3

下面是java代码。我需要知道python中的等效代码:

class A {
    public static A obj = new A();
}
4

4 回答 4

6

您不能在 python 类定义中执行此操作,因为该类直到class:块结束时才被定义。您必须在以下情况下进行设置:

class A(object): 
    pass    
A.obj = A()
于 2013-06-07T13:32:51.467 回答
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,但它是一种不太复杂的实现方式。

于 2013-06-07T13:41:30.090 回答
1

在创建类的任何实例之前是否需要这个类成员?如果不是,您可以尝试在创建第一个实例时分配它:

class A (object):
    obj = None

    def __init__(self):
        if A.obj is None:
            a.obj = A()
            # or:
            a.obj = self
于 2013-06-07T14:31:30.423 回答
0

我认为您想这样做是因为您正在尝试实现像单例这样的模式或类似的东西。

您可以从 activestate 阅读以下配方:http: //code.activestate.com/recipes/52558/

它解释了它的工作方式并显示了一些代码。

于 2013-06-07T16:09:22.600 回答