• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
ellaha
博客园    首页    新随笔    联系   管理    订阅  订阅
元类

一,新式类与旧式类

  • 旧式类
    • 对于旧式类,类(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

 

posted on 2021-01-03 15:55  ellaha  阅读(110)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3