Heim  >  Artikel  >  Backend-Entwicklung  >  Erstellung und Verwendung von Metaklassen in Python

Erstellung und Verwendung von Metaklassen in Python

高洛峰
高洛峰Original
2017-03-01 13:47:361461Durchsuche

In Python können wir die Typfunktion verwenden, um dynamisch eine Metaklasse zu erstellen. Wir können auch das Attribut __metaclass__ verwenden, um eine Metaklasse anzugeben. Als Nächstes geben wir spezifische Beispiele, um die Erstellung und Verwendung von Metaklassen in Python zu erläutern >

Mit Metaklassen können Sie definieren, wie bestimmte Klassen erstellt werden. Im Grunde gibt es Ihnen die Kontrolle darüber, wie Ihre Klassen erstellt werden.

Metaklasse ist auch eine Klasse, eine Typklasse.

Metaklassen werden im Allgemeinen zum Erstellen von Klassen verwendet. Beim Ausführen einer Klassendefinition muss der Interpreter die richtige Metaklasse für diese Klasse kennen. Wenn dieses Attribut nicht definiert ist, sucht er nach dem Attribut __metaclass__ in der übergeordneten Klasse. Wenn es noch nicht gefunden wurde, suchen Sie nach globalen Variablen.

Für traditionelle Klassen ist ihre Metaklasse „types.ClassType“.

Metaklassen verfügen außerdem über einen Konstruktor, der drei Parameter übergibt: den Klassennamen, ein von der Basisklasse geerbtes Datentupel und ein Wörterbuch mit Klassenattributen.
Als nächstes definieren wir eine Metaklasse, die erfordert, dass beim Schreiben einer Klasse eine __str__()-Methode für die Klasse bereitgestellt werden muss. Wenn die __repr__()-Methode nicht bereitgestellt wird, gibt
eine Warnung aus.

from warnings import warn
#元类需要继承type类
class ReqStrSugRepr(type):
  def __init__(cls, name, bases, attrd):
  #构造函数需要传递的参数为类名,基类,类属性字典
    super(ReqStrSugRepr, cls).__init__(name, bases, attrd)
    # 判断__str__字符串是否在类的属性字典里
    if '__str__' not in attrd:
      raise TypeError('Class requires overriding of __str__()')

    if '__repr__' not in attrd:
      warn('Class suggests overriding of __repr__()\n', stacklevel=3)

class Foo(object):
  #给类指定元类 
  __metaclass__ = ReqStrSugRepr

  def foo(self):
    pass
#这一段代码不用创建类来测试,直接运行一下就会报错,可见元类的功力。

Erstellung und Verwendung von Metaklassen in Python



Typ

Die Typfunktion kann den Typ einer Variablen überprüfen, wie zum Beispiel:

# <type &#39;int&#39;>
# <type &#39;str&#39;>
type(1)     
type(&#39;mink&#39;)

Die Typfunktion kann auch eine erstellen neues Objekt

Typ akzeptiert drei Parameter: Name, Basen, Diktat. Der erste Parameter akzeptiert den Klassennamen, der zweite Parameter akzeptiert die übergeordnete Klasse (Tupelform) und der dritte Parameter akzeptiert Attribute und Methoden (Wörterbuchform)

X = type(&#39;X&#39;, (object,), dict(a=1))
# 等于
class X(object):
  a = 1

Hier sind die Methoden, die Funktionen akzeptieren

def say(self):
  print &#39;hello&#39;

X = type(&#39;X&#39;, (object,), dict(say=say))
x = X()

# pirnt hello
x.say()

Metaklasse

Wir alle wissen, dass Instanzobjekte über Klassen erstellt werden können und Metaklassen Klassen sind, die Klassenobjekte erstellen. Typ kann Klassenobjekte erstellen, was bedeutet, dass Typ eine Metaklasse ist.

Metaclass-Attribut

Wenn Sie Metaclass zum Erstellen eines Klassenobjekts verwenden möchten, müssen Sie dem Objekt ein __metaclass__-Attribut hinzufügen. Natürlich müssen Sie zuerst eine Metaklasse

class PrivateMetaclass(type):
  def __new__(cls, name, parents, attrs):
    attrs = dict((&#39;__%s&#39; % k, v) for k, v in attrs.itmes())
    return super(PrivateMetaclass, cls).__new__(cls, name, parents, attrs)

class A(object):
  __metaclass__ = PrivateMetaclass
  a = 1
  b = 2

a = A()
# raise AttributeError
print a.a, a.b 

# print 1, 2
print a.__a, a.__b

haben, damit Sie einige Funktionen der Klasse über die Metaklasse ändern können Variablen müssen private Variablen sein.


Weitere Artikel zur Erstellung und Verwendung von Metaklassen in Python finden Sie auf der chinesischen PHP-Website!

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