Eine kurze Analyse der Metaklasse von Python

高洛峰
Freigeben: 2016-10-17 11:51:33
Original
1000 Leute haben es durchsucht

Metaklassen werden im Allgemeinen zum Erstellen von Klassen verwendet. Beim Ausführen einer Klassendefinition muss der Interpreter die richtige Metaklasse der Klasse kennen. Der Interpreter sucht zunächst nach dem Klassenattribut __metaclass__. Wenn dieses Attribut vorhanden ist, weist er dieses Attribut dieser Klasse als Metaklasse zu. Wenn dieses Attribut nicht definiert ist, sucht es nach dem __metaclass__ in der übergeordneten Klasse. Wenn das __metaclass__-Attribut noch nicht gefunden wird, überprüft der Interpreter die globale Variable mit dem Namen __metaclass__ und verwendet sie, falls vorhanden, als Metaklasse. Andernfalls handelt es sich bei der Klasse um eine traditionelle Klasse mit „types.ClassType“ als Metaklasse.

Beim Ausführen der Klassendefinition wird die korrekte (normalerweise Standard-)Metaklasse dieser Klasse überprüft. Die Metaklasse übergibt (normalerweise) drei Parameter (an den Konstruktor): Klassenname, geerbt von der Basisklasse Ein Tupel von Daten und ein Wörterbuch von Attributen (von Klassen).

Wann wird die Metaklasse erstellt?

#!/usr/bin/env python  
   
print '1. Metaclass declaration'  
class Meta(type):  
    def __init__(cls, name, bases, attrd):  
        super(Meta,cls).__init__(name,bases,attrd)  
        print '3. Create class %r' % (name)  
   
print '2. Class Foo declaration'  
class Foo(object):  
    __metaclass__=Meta  
    def __init__(self):  
        print '*. Init class %r' %(self.__class__.__name__)  
   
# 何问起 hovertree.com
print '4. Class Foo f1 instantiation'  
f1=Foo()  
   
print '5. Class Foo f2 instantiation'  
f2=Foo()  
   
print 'END'  
输出
Nach dem Login kopieren

Ergebnis:


1. Metaklassendeklaration

2. Klassen-Foo-Deklaration

3. Klasse 'Foo' erstellen

Klasse Foo f1 Instanziierung

* Klasse Foo f2 Instanziierung

*. Init-Klasse 'Foo'

ENDE



Es ist ersichtlich, dass __metaclass_ ausgeführt wird, wenn die Klasse ist deklariert. _. Bei der zukünftigen Definition eines Klassenobjekts wird nur die __init__()-Methode in MetaClass aufgerufen.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!