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