鱼C论坛

 找回密码
 立即注册
查看: 1650|回复: 1

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

[复制链接]
发表于 2022-12-25 22:23:46 | 显示全部楼层 |阅读模式

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

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

x
0. 本节视频




1. 温馨提示

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


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

使用道具 举报

发表于 2023-1-12 00:08:45 | 显示全部楼层
元类的应用
  1. # 一、给所有的类添加一个属性:
  2. class MetaC(type):
  3.     def __new__(mcls, name, bases, attrs):
  4.         attrs['author'] = 'fishc'
  5.         return type.__new__(mcls, name, bases, attrs)

  6. class C(metaclass=MetaC):
  7.     pass
  8. class D(metaclass=MetaC):
  9.     pass

  10. c = C()
  11. d = D()
  12. print(c.author, d.author)# fishc fishc

  13. class MetaC(type):
  14.     def __init__(cls, name, bases, attrs):
  15.         cls.author = 'fishc'
  16.         return type.__init__(cls, name, bases, attrs)

  17. class C(metaclass=MetaC):
  18.     pass
  19. class D(metaclass=MetaC):
  20.     pass

  21. c = C()
  22. d = D()
  23. print(c.author, d.author)# fishc fishc

  24. # 二、对类名的定义规范做限制
  25. class MetaC(type):
  26.     def __init__(cls, name, bases, attrs):
  27.         if not name.istitle():
  28.             raise TypeError('类名必须为大写字母开头!')
  29.         type.__init__(cls, name, bases, attrs)

  30. try:
  31.     class mycls(metaclass=MetaC):
  32.         pass
  33. except TypeError as e:
  34.     print(e)# 类名必须为大写字母开头!

  35. # 三、修改对象的属性值 -> 如:把对象的所有字符串属性值都变成大写
  36. class MetaC(type):
  37.     def __call__(cls, *args, **kwargs):
  38.         new_args = [each.upper() for each in args if isinstance(each, str)]
  39.         return type.__call__(cls, *new_args, **kwargs)

  40. class C(metaclass=MetaC):
  41.     def __init__(self, name):
  42.         self.name = name

  43. c = C('FishC')
  44. print(c.name)# FISHC

  45. # 当然如果传入的不是str就不显示
  46. class C(metaclass=MetaC):
  47.     def __init__(self, *names):
  48.         self.names = names

  49. c = C('FishC', 'Python', 1223)
  50. print(c.names)# ('FISHC', 'PYTHON')

  51. # 四、限制类实例化时的传参方式 -> 如:要求类在实例化对象时只能关键字参数传参
  52. class MetaC(type):
  53.     def __call__(cls, *args, **kwargs):
  54.         if args:
  55.             raise TypeError('仅支持关键字参数~')
  56.         return type.__call__(cls, *args, **kwargs)

  57. class C(metaclass=MetaC):
  58.     def __init__(self, name):
  59.         self.name = name

  60. try:
  61.     c = C('fishc')
  62. except TypeError as e:
  63.     print(e)# 仅支持关键字参数~

  64. c = C(name='fishc')
  65. print(c.name)# fishc

  66. # 五、禁止一个类被实例化
  67. class NoInstances(type):
  68.     def __call__(self, *args, **kwargs):
  69.         raise TypeError('该类禁止实例化!')

  70. class C(metaclass=NoInstances):
  71.     pass

  72. try:
  73.     c = C()
  74. except TypeError as e:
  75.     print(e)# 该类禁止实例化!

  76. # 禁止实例化对象也可以使用静态方法和类方法
  77. class C(metaclass=NoInstances):
  78.     @staticmethod
  79.     def static_ok():
  80.         print('静态方法允许使用~')
  81.     @classmethod
  82.     def class_ok(cls):
  83.         print('类方法也允许使用~')

  84. C.static_ok()# 静态方法允许使用~
  85. C.class_ok()# 类方法也允许使用~

  86. # 六、只允许实例化一个对象
  87. class OnlyInstance(type):
  88.     def __init__(cls, *args, **kwargs):
  89.         cls.__instance = None
  90.         type.__init__(cls, *args, **kwargs)
  91.     def __call__(cls, *args, **kwargs):
  92.         if cls.__instance is None:
  93.             cls.__instance = type.__call__(cls, *args, **kwargs)
  94.             return cls.__instance
  95.         else:
  96.             return cls.__instance

  97. class C(metaclass=OnlyInstance):
  98.     pass

  99. c1 = C()
  100. c2 = C()
  101. print(c1 is c2)# True
  102. # c1和c2为同一个对象
  103. print(dir(C))
  104. # ['_OnlyInstance__instance', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
  105. # 对象被保存在类里边的_OnlyInstance__instance这个属性中
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 5 反对 0

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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