python中的元编程

python中

所有非object类都继承自object类

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

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

1. type类

1.1 type构建类


def __init__(self):
    self.x = 1000


def show(self):
    print(self.x)


XClass = type('X', (object, ), {'a': 100, 'b': 'abc',
                                '__init__': __init__,
                                'show': show})  # 类
print(XClass)
# <class '__main__.X'>
print(XClass.__name__)  # X
print(XClass.__dict__)
# (<class 'object'>,)
print(XClass.__bases__)
print(XClass.mro())
# [<class '__main__.X'>, <class 'object'>]
print(XClass().x)  # 1000

print(XClass().show())  # None
print(type(XClass))  # <class 'type'>

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~~~~~~~~')


"""
~~~~~~~~~~~~~~~~~~
<class '__main__.Meta'>
('A', (), {'__module__': '__main__', '__qualname__': 'A'})
{}

"""

print(type(A))  # <class '__main__.Meta'>
print(A.__bases__)  # (<class 'object'>,),没有return语句,直接报错Nonetype
print(A.__dict__)

print('++++++++++++++')


class B(A):
    # B的属性也会受元类的影响,元类也可以改变B类的属性
    pass


print(type(B), B.__bases__)  # 继承时,元类与父类A一样
# <class '__main__.Meta'> (<class '__main__.A'>,)
print(B.__dict__)
# {'__module__': '__main__', 'id': 300, '__doc__': None}
print(B.__name__)  # B123

print(A.__bases__)  # (<class 'object'>,),没有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类的属性
    pass


C = Meta('C', (), {})
print(type(C), C.__bases__)
print(type(A), A.__bases__)
print(type(B), B.__bases__)  # 继承时,元类与父类A一样

"""
<class '__main__.Meta'> (<class 'object'>,)
<class '__main__.Meta'> (<class 'object'>,)
<class '__main__.Meta'> (<class '__main__.A'>,)
"""
print('+++++++++++++++++')


class D:
    pass


E = type('E', (), {})

print(type(D), D.__bases__)
print(type(E), E.__bases__)
# <class 'type'> (<class 'object'>,)
# <class 'type'> (<class 'object'>,)
print('====================')


class F(Meta):  # 注意是继承,F现在也是元类,元类实例化就是在构造新的类
    pass


print(type(F), F.__bases__)
# <class 'type'> (<class '__main__.Meta'>,)

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值