2015-05-31 5 views
5
class Custom(type): 
    @classmethod 
    def __getitem__(cls, item): 
     raise NotImplementedError("") 

    @classmethod 
    def test(cls): 
     print("class custom : test") 

class Book(metaclass=Custom): 
    Note = 0 
    Pad = 1 

    Name = { Note : "Note", Pad : "Pad"} 

    @classmethod 
    def __getitem__(cls, item): 
     return Book.Name[item] 

    @classmethod 
    def test(cls): 
     print("class book: test") 

Meine Absicht ist esWie überschreibt man __getitem__, wenn es sich um eine Klassenmethode handelt?

Book[Book.Note] returns "Note" 

Es scheint __getitem haben __() ist nicht überschreibbar, im Gegensatz zu Test(). Wie kann ich es funktionieren lassen?

Antwort

4

Sie verwenden hier eine Metaklasse. Dies ist keine strenge Vererbung: Sie haben die Klasse der Klasse Book als Custom definiert, während es früher type war. Da magische Methoden wie __getitem__ direkt in der Klasse und nicht auf der Instanz nachgeschlagen werden, ruft die Indizierung Book[whatever] tatsächlich die Methode __getitem__ der Klasse Book auf, die zufällig Custom ist.

Meine Absicht ist es

Book[Book.Note] 

returns "Note"

In diesem Fall zu haben, sollten Sie die Klasse von Book machen implementieren __getitem__, so dass es wieder "Note". Da die Klasse von BookCustom ist, ist dies, wo die Änderung vorgenommen werden muss:

class Custom(type): 
    def __getitem__(cls, item): 
     return cls.Name[item] 
    ... 

class Book(metaclass=Custom): 
    ... # as is, although you don't need the @classmethod __getitem__ 

Book[Book.Note] # "Note" 
Book[1]   # "Pad" 
+0

@ user1502776 Das ungerade ist. Ich benutze Python 3 selbst und es funktioniert. Lass mich sehen, ob ich eine Demo zusammenstellen kann. –

+0

Danke. Alles hat gut funktioniert. – user1502776

+0

Ihre Erklärung zeigt ein tiefgehendes Verständnis von Python-Funktionen. Könntest du bitte ein Buch weiterempfehlen? – user1502776

Verwandte Themen