鱼C论坛

 找回密码
 立即注册
查看: 976|回复: 8

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

[复制链接]
发表于 2022-11-11 05:41:01 | 显示全部楼层 |阅读模式

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

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

x
0. 本节视频




1. 温馨提示

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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-11 08:46:09 | 显示全部楼层
打卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-12 16:52:00 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-14 10:01:39 | 显示全部楼层
与isinstance()函数相似,type()函数通常用于检测对象的类型,返回对象相应的类。由于Python万物的奇点正是type,封神般存在的type()函数所能做的也远不止此!它可以根据传入的三个参数,返回一个新的类型(type对象),三个参数分别用于指定新类的名字(字符串)、父类(元组)、属性与方法(字典)。type()函数“造物者”的称号也便由此而来!
对象的__class__属性用于查看该对象的类型,类的__bases__属性用于查看该类的父类。
__init_subclass__()是Python3.6新增的类方法,用于加强父类对子类的管理。子类的属性会被定义了__init_subclass__()的父类的属性所覆盖,正所谓“父爱如山”,其原理与上一节讲过的类装饰器类同。当我们使用type()函数创造新类时,其第四个可选收集参数将被依次传递给父类的__init_subclass__()方法,这样写既简洁又优雅,何乐而不为呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-16 08:30:42 | 显示全部楼层
怎么看不了视频
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-1 01:42:15 | 显示全部楼层
tsElim 发表于 2022-11-16 08:30
怎么看不了视频

浏览器是否开启了无痕模式呢?

因为视频是引用自 Bilibili,如果开启了屏蔽第三方 cookie 的功能,就会导致视频无法加载哦!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-11 16:48:39 | 显示全部楼层
type()函数和__init_subclass__
  1. # 检测对象类型推荐使用isinstance()函数更合适,因为其会考虑到子类的情况
  2. print(int)# <class 'int'>
  3. print(float)# <class 'float'>
  4. print(set)# <class 'set'>
  5. print(type('l') is str)# True
  6. print(type(250)('520'))# 520
  7. print(type(type(250)('520')))# <class 'int'>
  8. # type(250)('520')相当于int('520')
  9. print(type([])('fishc'))# ['f', 'i', 's', 'h', 'c']
  10. print(type({}).fromkeys('python', 250))# {'p': 250, 'y': 250, 't': 250, 'h': 250, 'o': 250, 'n': 250}
  11. class C:
  12.     def __init__(self, x):
  13.         self.x = x

  14. c = C(250)
  15. print(c)# <__main__.C object at 0x000001C1DB9A7FD0>
  16. print(type(c))# <class '__main__.C'>
  17. d = type(c)(520)
  18. print(d)# <__main__.C object at 0x000001FB43FC7F70>
  19. print(d.__class__)# <class '__main__.C'>

  20. print(type(C))# <class 'type'>
  21. print(type(type))# <class 'type'>
  22. # type()就是python万物的起点:python万物皆对象,包括生成对象的类自身也是对象,其是由type()生成而来的对象,而type()本身也是自己的对象

  23. # type()第二种用法:根据传入的三个参数返回一个新的type对象
  24. class C:
  25.     pass

  26. C = type('C', (), {})# 参数一name指定类名;参数二base指定父类,用元组收集;参数三dict指定属性和方法,用字典收集
  27. c = C()
  28. print(c.__class__)# <class '__main__.C'>
  29. print(C.__bases__)# (<class 'object'>,)
  30. D = type('D', (C,), {})
  31. print(D.__bases__)# (<class '__main__.C'>,)
  32. E = type('E', (C,), dict(x=250, y=520))
  33. print(E.__dict__)# {'x': 250, 'y': 520, '__module__': '__main__', '__doc__': None}
  34. # 创建方法:
  35. def func(self, name='fishc'):
  36.     print(f'hello {name}')
  37. F = type('F', (), dict(say_hi=func))
  38. f = F()
  39. f.say_hi()# hello fishc
  40. f.say_hi('python')# hello python
  41. # 第四个参数(可选)kwds收集参数:当且仅当需要时,该收集参数将被传递给适当的元类机制(通常为__init_subclass__)

  42. # __init_subclass__()作用:加强父类对子类的管理
  43. class C:
  44.     def __init_subclass__(cls):
  45.         print('dad loves you')
  46.         cls.x = 520

  47. class D(C):
  48.     x = 250
  49. # dad loves you
  50. # 子类D定义完成后,父类C就会触发__init_subclass__()方法
  51. print(D.x)# 520
  52. # 在类定义完成后触发,所以子类的属性被覆盖
  53. class C:
  54.     def __init_subclass__(cls, value):
  55.         print('dad loves you')
  56.         cls.x = value

  57. class D(C, value=520):# 注意这种写法
  58.     x = 250
  59. # dad loves you
  60. print(D.x)
  61. # 520

  62. # 当使用type()函数构造想class D这种继承了定义过__init_subclass__()的父类时,如果需要给__init_subclass__()传递参数(如value),就可以通过第四个参数接力
  63. D = type('D', (C,), dict(x=250), value=520)
  64. # dad loves you
  65. print(D.x)
  66. # 520

  67. # 第四个参数是收集参数
  68. class C:
  69.     def __init_subclass__(cls, value1, value2):
  70.         print('dad loves you')
  71.         cls.x = value1
  72.         cls.y = value2

  73. D = type('D', (C,), dict(x=250), value1=520, value2=666)
  74. # dad loves you
  75. print(D.x)#520
  76. print(D.y)#666

  77. class C:
  78.     def __init_subclass__(cls, **kwargs):
  79.         print('dad loves you')
  80.         cls.x = list(kwargs.values())[0]
  81.         cls.y = list(kwargs.values())[1]

  82. D = type('D', (C,), dict(x=250), value1=520, value2=666)
  83. # dad loves you
  84. print(D.x)#520
  85. print(D.y)#666
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2023-10-16 20:52:29 | 显示全部楼层
class C:
    def __init__subclass__(cls, v):
        print('Here!')
        cls.x = value
        return

class D(C, v=100):
    x = 1000

   
Traceback (most recent call last):
  File "<pyshell#75>", line 1, in <module>
    class D(C, v=100):
TypeError: D.__init_subclass__() takes no keyword arguments

请问这段代码为什么会报错?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-19 13:46:31 From FishC Mobile | 显示全部楼层
RichardYang  2023-10-16 20:52
class C:
    def __init__subclass__(cls, v):
        print('Here!')

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 23:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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