2017-02-21 6 views
-1

Angenommen, ich habe eine Klasse:Python Überschreibung metaclass Satzattribut

class ABC: 
    pass 

Und ich tue:

ABC.x = 123 

Das macht mir keinen Fehler, obwohl ich kein Objekt erstellt haben. Welche der __func__ Methoden wird aufgerufen und wie überschreibe ich sie?

+0

Sie auf das Klassenobjekt das Attribut festlegen. So wird '__setattr__' aufgerufen, aber es wird in der Metaklasse aufgerufen. Suche nach Metaklassen, um eine Vorstellung davon zu bekommen, wofür du dich interessierst. – BrenBarn

+0

@BrenBarn danke für den Rat, ich werde das bald tun. Um jedoch mein unmittelbares Problem zu lösen, können Sie eine Antwort einreichen? :) –

+0

Verwenden Sie Python 2 oder Python 3? – BrenBarn

Antwort

1

Sie benötigen einen metaclass zu definieren und __setattr__ dort außer Kraft setzen, dann die Klasse Gebrauch machen, die Metaklasse.

class Meta(type): 
    def __new__(meta, name, bases, attrs): 
     return super().__new__(meta, name, bases, attrs) 

    def __setattr__(cls, attr, value): 
     print("I am setting {}.{} = {}".format(cls.__name__, attr, value)) 
     return super().__setattr__(attr, value) 

class Foo(metaclass=Meta): 
    pass 

Dann:

>>> Foo.blah = 2 
I am setting Foo.blah = 2 
>>> Foo.blah 
2