Python metaclass 元类

__ new__

__new____init__之前被调用,他创建对象实例后把实例对象self传递个 __init__

class A():
 def __new__(self):
  print('__new__')

 def __init__(self):
  print('__init__')

>>> A()
'__new__' # __init__ 没有被执行到

# 默认下的 __new__
class A():
 def __new__(self):
  print('__new__')
  return super().__new__(self) # 默认情况 __new__ 交棒给 __init__

 def __init__(self):
  print('__init__')

A()
'__new__'
'__init__'

所以事实上类内部一些初始化的工作由__new__完成,我们前面才说了__new__才是真正意义上的构造函数


metaclass

metaclass是类在创建的过程中,内部执行流程的一道主要工序。因此通过metaclass可以拦截到类的创建过程,所以有时我们会使用它来做一些类的动态修改

# 普通版类的创建
class A():
 def __init__(self):
  self.name = 'A'

 def hello():
  return "I'm a"


# Metaclass 元类版类的创建 | 两种方式相等
class Metaclass(type):
 def __new__(self, class_name, class_parents, class_attr):
  # 参数1 class_name 类名 | 本例 默认 A
  # 参数2 class_parents 父类 | 本例 默认 (object,)
  # 参数3 以字典的形式写入属性和方法
  return super().__new__(self, class_name, class_parents, {'name': 'A', 'hello': lambda x: "I'm a!"})

class A(object, metaclass=Metaclass):
 pass

>>> A().name
'A'

>>> A().hello()
'hello'
更多教程 HTML5 教程 CSS3 教程 JavaScript 教程 JQuery 教程 React.js 教程 Node.js 教程 Koa2 教程 Python 教程 Linux 教程