如何在python中定义引用同一类对象的类变量

时间:2013-06-07 13:30:01

标签: java python class static

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

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

4 个答案:

答案 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/

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