2016-01-23 11 views
6

Wiem, że możemy przeciążyć zachowanie instancji klasy, np. -Czy możemy przeciążyć zachowanie obiektu klasy

class Sample(object): pass 
s = Sample() 
print s 
<__main__.Sample object at 0x026277D0> 
print Sample 
<class '__main__.Sample'> 

Możemy zmienić wynik print s:

class Sample(object): 
    def __str__(self): 
    return "Instance of Sample" 
s = Sample() 
print s 
Instance of Sample 

możemy zmienić wynik print Sample?

Odpowiedz

5

Można użyć metaclass:

class SampleMeta(type): 
    def __str__(cls): 
     return ' I am a Sample class.' 

Python 3:

class Sample(metaclass=SampleMeta): 
    pass 

Python 2:

class Sample(object): 
    __metaclass__ = SampleMeta 

wyjściowa:

I am a Sample class. 

Metaclass jest klasą klasy. Jego relacja z klasą jest analogiczna do relacji klasy do instancji. Używane jest to samo oświadczenie class. Dziedziczenie z formularza type zamiast z object powoduje, że jest to metaclass. Konwencja nr self zostaje zastąpiona przez cls.

Powiązane problemy