实用:python中的元编程

本文探讨了Python中的元编程技术,通过实例展示了如何利用元编程来增强代码的灵活性和可扩展性,包括创建动态类型、自定义类行为等方面的应用,帮助开发者提升编程效率。
摘要由CSDN通过智能技术生成
#传统编程
class A1:
    def __init__(self,name='a1'):
        self.name = name
        print('a1 init')

    def show(self):
        print('a1 show')

#元编程(用代码生成代码)
def __init__(self,name='b1'):
    self.name = name
    print('b1 init')

def show(self):
    print('b1 show')

B1 = type('B1',(object,),{'__init__':__init__,'show':show})


#测试
print(A1)
print(type(A1))
print(A1.__dict__)
print(A1.mro())
print(A1().__dict__)

print('===========================')

print(B1)
print(type(B1))
print(B1.__dict__)
print(B1.mro())
print(B1().__dict__)

运行结果:

<class '__main__.A1'>
<class 'type'>
{'__doc__': None, '__init__': <function A1.__init__ at 0x7f9a0b5fcbf8>, 'show': <function A1.show at 0x7f9a0b5fcc80>, '__dict__': <attribute '__dict__' of 'A1' objects>, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'A1' objects>}
[<class '__main__.A1'>, <class 'object'>]
a1 init
{'name': 'a1'}
===========================
<class '__main__.B1'>
<class 'type'>
{'__doc__': None, '__init__': <function __init__ at 0x7f9a0cbbaf28>, 'show': <function show at 0x7f9a0b5fcd08>, '__dict__': <attribute '__dict__' of 'B1' objects>, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'B1' objects>}
[<class '__main__.B1'>, <class 'object'>]
b1 init
{'name': 'b1'}

改进:

class XMeta(type):
    def __new__(cls,what,bases,dict):
        print(1,cls)
        print(2,what)
        print(3,bases)
        print(4,dict)
        return super().__new__(cls,what,bases,dict) #等价于type.__new__(XMeta,*args,**kwargs) -->return XMeta

class A:
    def __init__(self):
        print('a init')
print('++++++++++++++++++++++++')
class B(A,metaclass=XMeta): #继承A并修改自己的元类为XMeta
    def __init__(self):
        super().__init__()
        print('b init')

print('============1============')
class C(B): pass #继承B并继承他的元类XMeta
class D(): pass #默认继承自type
E = XMeta('E',(),{}) #指定自己元类,相当于class E(metaclass=XMeta)

print('============2============')
print(type(A))
a = A()
print(type(a))
print('============3============')
print(type(B))
b = B()
print(type(b))
print('============4============')
print(type(C))
c = C()
print(type(c))
print('============5============')
print(type(D))
d = D()
print(type(d))
print('============6============')
print(type(E))
e = E()
print(type(e))

运行结果:

++++++++++++++++++++++++
1 <class '__main__.XMeta'>
2 B
3 (<class '__main__.A'>,)
4 {'__init__': <function B.__init__ at 0x7f1314efbd08>, '__module__': '__main__', '__qualname__': 'B'}
============1============
1 <class '__main__.XMeta'>
2 C
3 (<class '__main__.B'>,)
4 {'__module__': '__main__', '__qualname__': 'C'}
1 <class '__main__.XMeta'>
2 E
3 ()
4 {}
============2============
<class 'type'>
a init
<class '__main__.A'>
============3============
<class '__main__.XMeta'>
a init
b init
<class '__main__.B'>
============4============
<class '__main__.XMeta'>
a init
b init
<class '__main__.C'>
============5============
<class 'type'>
<class '__main__.D'>
============6============
<class '__main__.XMeta'>
<class '__main__.E'>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值