2017-01-20 4 views
3

私はクラス変数として自分自身のインスタンスを持つクラスを定義しようとしているので、私はその場所全体の共通インスタンスを参照できます。クラスのインスタンスをPythonのクラス変数として自分のクラスに保存するにはどうしたらいいですか?

どうすればこのようにすることができますか?おそらく

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

Point.ORIGIN = Point() 

をあなたはおそらくも原点が記述子を経由して遅延して作成されるようにそれを動作させる、またはあなたことができ:

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) 
+1

"共通インスタンス"が必要な場合は、おそらく静的変数/メソッドを探しているでしょう。 – TigerhawkT3

+1

サイドノート:「math.hypot」を再発明していますが、あなたの精度はそれほど正確ではありません。 – Kevin

答えて

6

後にクラスが作成されていますが、クラス属性を追加することができますメタクラスを使って何かファンキーなことをしてください。しかし、それはあなたの価値があるとは思われません。

+0

実用的なソリューションをありがとう!私はORIGINが潜在的に長いクラス定義の後に最下点で起こらなければならないことに失望していますが、それはもっと複雑にならずに行くための最良の方法だと思われます。 –

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) 
+0

これは知っておく価値があるように見えます。メタクラスがどのように動作するか、あるいはそのコンストラクタが呼び出されたときに、もっと詳しく教えてください。 – JoshOrndorff

+2

@JoshOrndorff - メタクラスコンストラクタは、クラスの作成時に呼び出されます。例えばこの場合、 'SingletonMeta____ new__'は' Point'クラスを作成するために呼び出されます。 'SingletonMeta .__ init__'は、' Point'が作成された直後に呼び出されます。 [あなたはこの質問/回答でメタクラスについてたくさんのことを読むことができます](http://stackoverflow.com/questions/100003/what-is-a-metmetlass-in-python)。 – mgilson

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 
関連する問題