博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中的元编程
阅读量:4130 次
发布时间:2019-05-25

本文共 2550 字,大约阅读时间需要 8 分钟。

python中

所有非object类都继承自object类

所有类的类型包括type类都是type

type类继承自object类,object类的类型也是type类

1. type类

1.1 type构建类

def __init__(self):    self.x = 1000def show(self):    print(self.x)XClass = type('X', (object, ), {'a': 100, 'b': 'abc',                                '__init__': __init__,                                'show': show})  # 类print(XClass)# 
print(XClass.__name__) # Xprint(XClass.__dict__)# (
,)print(XClass.__bases__)print(XClass.mro())# [
,
]print(XClass().x) # 1000print(XClass().show()) # Noneprint(type(XClass)) #
class Meta(type):    # 现在的new方法跟以前不同了    def __new__(mcs, name, bases, attr: dict):        print(mcs)        print(name)        print(bases)        print(attr)        attr['id'] = 300  # 会改变类A中自己定义的id        print()        return super().__new__(mcs, name + '123', bases, attr)  # 什么都可以改变print("~~~~~~~~~~~~~~~~~~")# 元类是创造类的类class A(metaclass=Meta):  # 修改了元类,并没有改变继承列表    # A的名字可以被元类改变,不仅如此,A的所有属性都可以被元类修改    id = 2000    def __init__(self):        print('A.init~~~~~~~~')"""~~~~~~~~~~~~~~~~~~
('A', (), {'__module__': '__main__', '__qualname__': 'A'}){}"""print(type(A)) #
print(A.__bases__) # (
,),没有return语句,直接报错Nonetypeprint(A.__dict__)print('++++++++++++++')class B(A): # B的属性也会受元类的影响,元类也可以改变B类的属性 passprint(type(B), B.__bases__) # 继承时,元类与父类A一样#
(
,)print(B.__dict__)# {'__module__': '__main__', 'id': 300, '__doc__': None}print(B.__name__) # B123print(A.__bases__) # (
,),没有return语句,直接报错Nonetype
class Meta(type):    # 现在的new方法跟以前不同了    def __new__(mcs, name, bases, attr: dict):        print(mcs)        print(name)        print(bases)        print(attr)        attr['id'] = 300  # 会改变类A中自己定义的id        print()        return super().__new__(mcs, name, bases, attr)  # 什么都可以改变print("~~~~~~~~~~~~~~~~~~")# 元类是创造类的类class A(metaclass=Meta):  # 修改了元类,并没有改变继承列表    # A的名字可以被元类改变,不仅如此,A的所有属性都可以被元类修改    id = 2000    def __init__(self):        print('A.init~~~~~~~~')class B(A):    # B的属性也会受元类的影响,元类也可以改变B类的属性    passC = Meta('C', (), {})print(type(C), C.__bases__)print(type(A), A.__bases__)print(type(B), B.__bases__)  # 继承时,元类与父类A一样"""
(
,)
(
,)
(
,)"""print('+++++++++++++++++')class D: passE = type('E', (), {})print(type(D), D.__bases__)print(type(E), E.__bases__)#
(
,)#
(
,)print('====================')class F(Meta): # 注意是继承,F现在也是元类,元类实例化就是在构造新的类 passprint(type(F), F.__bases__)#
(
,)

 

 

 

 

 

 

 

 

 

 

 

转载地址:http://wvfvi.baihongyu.com/

你可能感兴趣的文章
阅读笔记《c++ primer》
查看>>
阅读笔记《C++标准程序库》
查看>>
基于mirror driver的windows屏幕录像
查看>>
C语言8
查看>>
Qt实现简单延时
查看>>
qml有关矩形说明
查看>>
在qt中使用QSplitter设置初始比例setStretchFactor失效的解决方法
查看>>
repeater的使用
查看>>
qt msvc编译中文乱码解决
查看>>
qt中TextField输入框无法输入中文解决办法
查看>>
qt实现点击出现窗口,点击其他任何地方窗口消失
查看>>
QML DropArea拖拉文件事件
查看>>
CORBA links
查看>>
读后感:>
查看>>
ideas about sharing software
查看>>
different aspects for software
查看>>
To do list
查看>>
Study of Source code
查看>>
如何使用BBC英语学习频道
查看>>
spring事务探索
查看>>