Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Analyse der Metaklasse von Python

Eine kurze Analyse der Metaklasse von Python

高洛峰
高洛峰Original
2016-10-17 11:51:331002Durchsuche

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'  
输出

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.

Stellungnahme:
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