python metaclass_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'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值