元编程类编程

1. 标准库type类

1.1 创建类方法

所以说创建类的两种方法:
- 第一种方法为通过传统的方法class定义类
- 第二种方法为通过type类实例化定义类

1.2 type类实例化生成类

在python标准库种所有类的类型就是type类型,也就是说type(类名)就是type类型,在标准库关于type类描述如下

class type(object):
    def __init__(cls, what, bases=None, dict=None): # known special case of type.__init__
        """
        type(object_or_name, bases, dict)
        type(object) -> the object's type
        type(name, bases, dict) -> a new type
        # (copied from class doc)
        """
        pass

可知:通过type(name,bases,dict)就可以创建出一个类,其中
- name:相当于class name中name的一个标识,是一个类名的一个标识
- bases:相当于class name (A,B)中的类继承与谁,如此时类继承于A和B这两个类
- dict:相当于类属性,如类的方法和属性
具体可参考案例如下:通过一个type类实例化创建类

class A:
    pass
class B:
    pass
print(type(A))
print(type(type))
print(A.__name__)
def __init__(self,name):
    self.name = name
print("*******")
C = type('B',(A,B),{'a':__init__})
print(C)
print(C.__bases__)
print(type(C))
print(C.__name__)
print(C.__dict__)
##################################################################
#运行结果:
<class 'type'>
<class 'type'>
A
*******
<class '__main__.B'>
(<class '__main__.A'>, <class '__main__.B'>)
<class 'type'>
B
{'__module__': '__main__', 'a': <function __init__ at 0x000001C1794138C8>, '__doc__': None}

2. type类继承

2.1 元编程new方法

在类的多继承过程中,可以采用一个类ModelMeta从type类继承过来,然后可以通过ModelMeta类实例化创建类

#########元类############
class ModelMeta(type):
    def __new__(cls, *args, **kwargs):
        print("~~~~~~~~~~~~~~~~")
        print("调用元类开始")
        print(cls)
        print(args)
        print(kwargs)
        print("~~~~~~~~~~~~~~~~~~~~~")
        return super().__new__(cls,*args,**kwargs)
#############测试类实例化创建类#############
C = type('test',(),{'A':10})
A = ModelMeta('test1',(),{'A':10})
print("1+++++")
print(type(C))
print("2+++++")
print(C.__dict__)
print("3+++++")
print(type(A))
print(A.__dict__)

2.2 元编程构造new方法

在元编程过程中,类只要从元编程构造时,都会调用new方法,定义继承时要明确指定从元类中继承:

#########元类############
class ModelMeta(type):
    def __new__(cls, *args, **kwargs):
        print("~~~~~~~~~~~~~~~~")
        print("调用元类开始")
        print(cls)
        print(args)
        print(kwargs)
        print("~~~~~~~~~~~~~~~~~~~~~")
        return super().__new__(cls,*args,**kwargs)

###############普通继承任然是元类,new方法仅会继承,但不执行##################       
class AA(ModelMeta):# 并非从元编程中继承,是从普通的type继承,此类任然是元类
    pass
print("4++++++")
print(type(AA))
##############元类继承,因此叫元编程,不仅仅会继承new方法,而且会执行new方法##################
class BB(metaclass=ModelMeta):#从元编程中继承,mataclass所以会调用new方法
    pass
print("5++++++")
print(type(BB))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值