2017-07-19 5 views
1

私は多くのクラスを作成した小さな個人的なプロジェクトに取り組んでいます。各クラスは、そのすべてのインスタンスを含む独自のレジスタを持っています複数のクラスのメソッドを定義する

class IterReg(type): 
    # Register of all objects for iteration 
    def __iter__(cls): 
     return iter(cls._reg.values()) 

私は各クラスに使用する「テンプレート」

class Point(object): 
    # Point object 
    __metaclass__ = IterReg 
    _reg = dict() 
    counter = 0 

    # Initialize 
    def __init__(self, name): 
     self.name = name 
     self._reg[self.name] = self 
     Point.counter += 1 

    # Return register keys 
    @staticmethod 
    def get_reg_keys(cls): 
     return cls._reg.keys() 

そして、いくつかの(MWEのために重要ではない)他のものです。 私は初期化する場合は、例えば、a = Point("Point A")、私はそれから呼び出すことができます。

>>> a.get_reg_keys() 
['Point A'] 

を(明らかに)私は

Point.get_reg_keys() 

から今、私の質問を取得することと同じ結果である:定義する方法がありますこのメソッドはすべてのクラスに対して一度(つまり、何とかmetaclassにあります)。

class IterReg(type): 
    # Register of all objects for iteration 
    def __iter__(cls): 
     return iter(cls._reg.values()) 

    def get_reg_keys(cls): 
     return cls._reg.keys() 

をしかし、私はちょうどそれの任意のインスタンスからクラスからget_reg_keys()(すなわちPoint.get_reg_keys())とされていない呼び出すことができます。 私が最初にこのような何かが働いていたと思いました。

+3

'get_reg_keys'メソッドと一般的な' __init__'メソッドを持つ基本クラス(つまり 'RegisteredBase')を作成するだけではどうですか?それから 'Point'クラスをサブクラス化してください。 – Kendas

+0

'Point.get_reg_keys()'は静的関数を呼び出す正しい方法です。 –

答えて

1

.get_reg_keys()の汎用クラスを定義し、そのメソッドを使用するときにサブクラス化することができます。以下の例では、Genericから継承するクラスは.get_reg_keys()メソッドを持ちます。

class IterReg(type): 
    # Register of all objects for iteration 
    def __iter__(cls): 
     return iter(cls._reg.values()) 

class Generic(object): 
    @classmethod 
    def get_reg_keys(cls): 
     return cls._reg.keys() 

class Point(Generic): 
    # Point object 
    __metaclass__ = IterReg 
    _reg = dict() 
    counter = 0 

    # Initialize 
    def __init__(self, name): 
     self.name = name 
     self._reg[self.name] = self 
     Point.counter += 1 


a = Point('Point A') 
a.get_reg_keys() 
# returns: 
['Point A'] 
関連する問題