如何在Python中将类的实例保存为类变量?

时间:2017-01-20 01:18:35

标签: python python-3.x

我试图定义一个具有自身实例作为类变量的类,因此我可以在整个地方引用它的公共实例。

我怎样才能让这样的事情发挥作用?

class Point():
  ORIGIN = Point()

  def __init__(self, x=0, y=0):
    self.x = x
    self.y = y

p0 = Point.ORIGIN
p1 = Point(3,4)

distance = (p1.x*p1.x + p1.y*p1.y) ** .5
print(distance)

3 个答案:

答案 0 :(得分:6)

您可以在创建类之后添加类属性

class Point():
  def __init__(self, x=0, y=0):
    self.x = x
    self.y = y

Point.ORIGIN = Point()

你可能也可以让它工作,以便通过描述符懒惰地创建原点,或者你可以使用元类做一些时髦的东西 - 但这似乎不值得你这么做。

答案 1 :(得分:1)

可以使用元类:

>>> class SingletonMeta(type):
...     def __init__(cls, name, bases, dct):
...         cls.ORIGIN = cls()
...
>>> class Point(metaclass=SingletonMeta):
...     def __init__(self, x=0, y=0):
...         self.x = x
...         self.y = y
...
>>> p0 = Point.ORIGIN
>>> p1 = Point(3,4)
>>> p0
<__main__.Point object at 0x110b7e7b8>
>>> p0.x, p0.y
(0, 0)

答案 2 :(得分:1)

只需创建表示所需值的类变量,而不是在实例中封装这些值:

class Point:
    x = 0
    y = 0
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

x,y = Point.x, Point.y
p1 = Point(3,4)
distance = ((p1.x-x)**2 + (p1.y-y)**2) ** .5
print(distance) # prints 5.0

或者,更好的是:

class Point:
    x = 0
    y = 0
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y
    def distance(self, other=None):
        if other is None:
            x,y = Point.x, Point.y
        else:
            x,y = other.x, other.y
        return ((self.x-x)**2 + (self.y-y)**2) ** .5

然后你可以这样做:

>>> p1 = Point(3,4)
>>> p1.distance()
5.0
>>> p1.distance(Point(3,5))
1.0