鱼C论坛

 找回密码
 立即注册
查看: 1747|回复: 6

[知识点备忘] 第079讲:类和对象(XXII)

[复制链接]
发表于 2022-12-1 01:42:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
0. 本节视频




1. 温馨提示

如果在学习本节课的过程中遇到问题,可以在这个帖子下方提问哦~


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-1-11 23:32:00 | 显示全部楼层
元类(metaclass)
  1. # 创造类的模板,type就是一个元类,所有元类都继承自type
  2. class MetaC(type):
  3.     pass

  4. class C(metaclass=MetaC):
  5.     pass

  6. c = C()
  7. print(type(c))# <class '__main__.C'>
  8. print(type(C))# <class '__main__.MetaC'>
  9. # 未指定元类的话是<class 'type'>
  10. print(type(MetaC))# <class 'type'>

  11. class MetaC(type):
  12.     def __new__(mcls, name, bases, attrs):
  13.         print('__new__() in MetaC~')
  14.         return type.__new__(mcls, name, bases, attrs)
  15.     def __init__(cls, name, bases, attrs):
  16.         print('__init__() in MetaC~')
  17.         type.__init__(cls, name, bases,attrs)

  18. class C(metaclass=MetaC):
  19.     def __new__(cls):
  20.         print('__new__() in C~')
  21.         return super().__new__(cls)# 调用的是object的__new__()
  22.     def __init__(self):
  23.         print('__init__() in C~')
  24. # __new__() in MetaC~
  25. # __init__() in MetaC~
  26. # 元类里的__new__()方法是在类C定义完成的那一刻触发

  27. c = C()
  28. # __new__() in C~
  29. # __init__() in C~

  30. # object是所有类的父类,元类比类高一级别,元类继承自type

  31. # 元类两个方法中各参数的作用:
  32. class MetaC(type):
  33.     def __new__(mcls, name, bases, attrs):
  34.         print(f'mcls={mcls}, name={name}, bases={bases}, attrs={attrs}')
  35.         return type.__new__(mcls, name, bases, attrs)
  36.     def __init__(cls, name, bases, attrs):
  37.         type.__init__(cls, name, bases,attrs)
  38.         print(f'cls={cls}, name={name}, bases={bases}, attrs={attrs}')

  39. class C(metaclass=MetaC):
  40.     pass
  41. # mcls=<class '__main__.MetaC'>, name=C, bases=(), attrs={'__module__': '__main__', '__qualname__': 'C'}
  42. # cls=<class '__main__.C'>, name=C, bases=(), attrs={'__module__': '__main__', '__qualname__': 'C'}
  43. # 各参数作用跟上节type中各参数作用一致

  44. # 把__call__()方法定义在元类里,拦截类实例化对象的操作
  45. class MetaC(type):
  46.     def __call__(cls, *args, **kwargs):
  47.         print('__call__() in MetaC~')

  48. class C(metaclass=MetaC):
  49.     pass

  50. c = C()
  51. # __call__() in MetaC~

  52. # 绝大多数元类用到的就是__new__()、__init__()、__call__()三个魔法方法
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

发表于 2023-7-17 19:47:36 | 显示全部楼层
难受哦!感觉啥也讲了,又感觉我啥也学到,【手动痛苦面具
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-30 20:20:46 | 显示全部楼层
class MetaC(type):
    def __new__(mcls, name, bases, attrs):
        print('__new__() in MetaC~')
        return type.__new__(mcls, name, bases, attrs)
    def __init__(cls, name, bases, attrs):
        print('__init__() in MetaC~')
        type.__init__(cls, name, bases,attrs)
这里面return type.__new__(mcls, name, bases, attrs)和type.__init__(cls, name, bases,attrs)这两句代码是什么意思呢,起什么作用?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-17 20:58:24 | 显示全部楼层
基类object和元类是什么区别??
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-17 21:02:31 | 显示全部楼层
CorrineLL 发表于 2023-9-17 20:58
基类object和元类是什么区别??

type>元类>基类object>普通类??
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-15 11:36:58 | 显示全部楼层
CorrineLL 发表于 2023-9-17 21:02
type>元类>基类object>普通类??

我感觉是   type>type以及元类>基类以及类>对象
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-5 13:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表