2017-07-19 64 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']