2017-07-19 2 views
1

Ich arbeite an einem kleinen persönlichen Projekt, wo ich viele Klassen erstellt habe. Jede Klasse hat ein eigenes Register, das alle seine Instanzen:Methoden für mehrere Klassen definieren

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

Die „Vorlage“, die ich für jede Klasse verwenden ist

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() 

und einige andere (nicht wichtig für ein MWE) Sachen. Wenn ich initialisieren, zB a = Point("Point A"), kann ich dann rufen:

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

, die (natürlich) das gleiche Ergebnis, dass ich von

bekommen
Point.get_reg_keys() 

Nun meine Frage: Gibt es eine Möglichkeit zu definieren, diese Methode einmal für alle Klassen (also irgendwie in der metaclass). dachte ich zuerst so etwas gearbeitet hatte:

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() 

Aber dann kann ich einfach anrufen get_reg_keys() aus der Klasse (d Point.get_reg_keys()) und nicht von irgendeiner Instanz davon.

+3

Warum nicht einfach eine Basisklasse erstellen (zB 'RegisteredBase'), die Ihre' get_reg_keys' Methode und die generische '__init__' Methode hat? Dann unterwerfe deine Klasse "Point" einfach davon. – Kendas

+0

'Point.get_reg_keys()' ist die korrekte Methode, diese statische Funktion jedoch aufzurufen –

Antwort

1

Sie können eine generische Klasse definieren, die .get_reg_keys() hat, und eine Unterklasse erstellen, wenn Sie diese Methode verwenden möchten. Im folgenden Beispiel wird für jede Klasse, die von Generic erbt, die Methode .get_reg_keys() verwendet.

Verwandte Themen