一,新式类与旧式类
- 旧式类
- 对于旧式类,类(class)和(type)并不完全相同。一个旧式类的实例总是继承自一个名为instance的内置类型。如果obj是旧式类的实例,那么obj.class就表示该类,但type(obj)始终是instance类型
- 新式类
- 新式类统一了类(class)和类型(type)的概念。如果obj是新式类实例,type(obj)则与obj.class相同
- 注意点
- 在python2
二,类型(type)和类(class)
在python中一切皆对象。类也是对象,所以一个类(class)必须有一个类型(type)
- 实例的类型是类
- 类的类型是type
class Test: pass t = Test() print(type(t)) # <class '__main__.Test'> print(type(Test)) # <class 'type'>
- type的类型是type
- 注意区分元类和继承的基类
- 元类type:python03中所有的类都是通过type来创建出来的
- object:顶层的基类,python03中所有类的顶层父类都是object
三,使用type动态定义类
内置type()函数在传递了一个参数时将返回类对象(class)。对于新式类,通常与对象的class属性相同。
class type(object): """ type(object_or_name, bases, dict) type(object) -> the object's type type(name, bases, dict) -> a new type
- name:指定类名称,将成为该类的name属性 ->str类型
- bases:指定继承类的基类元组,将成为该类的bases属性 ->tuple类型
- dict:方法和属性,指定包含主体的名称空间字典,将成为该类的dict属性 ->dict类型键值对的形式表示属性或者对应的方法
def func(self): print('打印func方法') Test = type('Test11', (object,), {"attr":100, "__attr2":200, 'function1':func}) t = Test() t.function1()
四,自定义元类
- 必须继承type
- 否则无法拥有创建类的能力(python中拥有创建类的能力就是type)
- 重写new方法
- 通过类来创建对象,触发的是new方法,自己定义的元类因此要重写new方法
- type创建类的时候需要3个参数
- 3个参数从方法的形参中接收,然后传给type的new方法中
class MyMetaClass(type): """ 最基础的自定义元类 """ def __new__(cls, name, bases, attr_dict, *args, **kwargs):
return super().__new__(cls, name, bases, attr_dict,) # return type.__new__(name, bases, attr_dict) # 报错了
# 通过自定义的元类创建类 class Test(metaclass=MyMetaClass): pass print(type(Test)) # <class '__main__.MyMetaClass'>
五,ORM模型实现思路
https://blog.csdn.net/a2011480169/article/details/87891753
type的两个功能
- 查找对象类型
- 创造一个新的类型
class type(object): """ type(object_or_name, bases, dict) type(object) -> the object's type type(name, bases, dict) -> a new type