鱼C论坛

 找回密码
 立即注册
查看: 2164|回复: 4

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

[复制链接]
发表于 2022-9-3 18:52:07 | 显示全部楼层 |阅读模式
购买主题 已有 10 人购买  本主题需向作者支付 5 鱼币 才能浏览
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-4 14:03:20 | 显示全部楼层
  1. >>> X = 10
  2. >>> V = 5
  3. >>> I = 1
  4. >>> XVI = X + V + I
  5. >>> print(XVI)
  6. 16
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-9 10:27:57 | 显示全部楼层
本节讲了两个基本概念:类方法和静态方法。类方法是指用于绑定类的方法,用@classmethod装饰器来定义,绑定的是类而非实例对象;静态方法则是指放在类中的函数,用@staticmethod装饰器来定义,无需绑定。使用类方法和静态方法都不必担心实例属性覆盖类属性的问题。实际中要根据应用场景“因地制宜”,当操作不涉及类属性或实例属性引用时使用静态方法,当统计实例对象数量时使用类方法更好,在涉及继承时可实现自动化,分别统计,易于扩展,简单便捷!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-1-7 23:01:42 | 显示全部楼层
本帖最后由 Ensoleile 于 2023-1-10 00:28 编辑

类方法和静态方法
  1. #类方法:classmethod装饰器,绑定的是一个类而非对象
  2. class C:
  3.     def funA(self):
  4.         print(self)
  5.     @classmethod
  6.     def funB(cls):
  7.         print(cls)

  8. c = C()
  9. c.funA()#<__main__.C object at 0x000001AAF996CFA0>
  10. c.funB()#<class '__main__.C'>
  11. #普通方法绑定的是一个对象object,类方法绑定的是类C
  12. #self和cls均为约定俗成的写法,更换了也没有错

  13. class C:
  14.     count = 0
  15.     def __init__(self):
  16.         C.count += 1
  17.     @classmethod
  18.     def get_count(cls):
  19.         print(f'该类一共实例化了{cls.count}个对象')

  20. c1 = C()
  21. c2 = C()
  22. c3 = C()
  23. c1.get_count()#该类一共实例化了3个对象
  24. #如果在一个对象中创建一个跟类属性同名的实例属性,则后者就会覆盖类属性,但这里由于get_count是类方法,所以就算实例属性覆盖了类属性,也不会改变类属性
  25. c3.count = 1
  26. print(c3.count)#1
  27. c3.get_count()#该类一共实例化了3个对象
  28. print(C.count)#3
  29. # 虽然直接使用类名来访问类属性也可以,但如果涉及到继承问题,那么使用类方法会有更大的优势

  30. # 静态方法:staticmethod装饰器,放在类里边的函数。在类里边定义一个不需要绑定对象(self)的函数
  31. class C:
  32.     @staticmethod
  33.     def funC():
  34.         print('i love you')

  35. c = C()
  36. c.funC()# i love you
  37. C.funC()# i love you

  38. class C:
  39.     count = 0
  40.     def __init__(self):
  41.         C.count += 1
  42.     @staticmethod
  43.     def get_count():
  44.         print(f'该类一共实例化了{C.count}个对象')

  45. c1 = C()
  46. c2 = C()
  47. c3 = C()
  48. c1.get_count()#该类一共实例化了3个对象
  49. c3.count = 1
  50. print(C.count)#3

  51. # 当操作不涉及类属性或实例属性引用时使用静态方法比较合适,如果像统计实例对象这种任务时,使用类方法实现更好
  52. class C:
  53.     count = 0
  54.     @classmethod
  55.     def add(cls):
  56.         cls.count += 1
  57.     def __init__(self):
  58.         self.add()
  59.     @classmethod
  60.     def get_count(cls):
  61.         print(f'该类一共实例化了{cls.count}个对象')

  62. class D(C):
  63.     count = 0

  64. class E(C):
  65.     count = 0

  66. c1 = C()
  67. d1, d2 = D(), D()
  68. e1, e2, e3 = E(), E(), E()
  69. c1.get_count()#该类一共实例化了1个对象
  70. d1.get_count()#该类一共实例化了2个对象
  71. e1.get_count()#该类一共实例化了3个对象
  72. # 当代码涉及到继承的时候,实例对象的数量统计就变得复杂了,此时类方法的优势便体现出来了。独立出一个add()的类方法,这样做是为了实现自动化,让构造函数调用add()类方法,就不用管他是子类还是父类,谁去调用谁就会自动把对应的类传递进去,那么递增的也就是该类对应的count类属性,相当于各回各家各找各妈。我们要做的就是在继承的时候覆盖一下对应类的count属性,就可以轻松实现各个类实例的对象数量统计。
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-2-23 21:35:34 | 显示全部楼层
  1. count=0
  2. >>> class C:
  3.         def __init__(self):
  4.                 global count
  5.                 count+=1
  6.         def count1(self):
  7.                 print(f"该类一共实例化了{count}个对象。")

  8.                
  9. >>> c=C()
  10. >>> f=C()
  11. >>> g=C()
  12. >>> v=C()
  13. >>> k=C()
  14. >>> k.count1 ()
  15. 该类一共实例化了5个对象。
  16. >>> g.count1 ()
  17. 该类一共实例化了5个对象。
复制代码


以上代码不用类方法绑定类,也能实现统计类实例化对象的个数
但是,如果绑定对象,则统计过程停止在指定的实例化对象,代码如下:

  1. count=0
  2. >>> class C:
  3.         def __init__(self):
  4.                 global count
  5.                 count+=1
  6.                 self.value=count
  7.         def count1(self):
  8.                 print(f"该类一共实例化了{self.value}个对象。")

  9.                
  10. >>> c=C()
  11. >>> b=C()
  12. >>> v=C()
  13. >>> f=C()
  14. >>> g=C()
  15. >>> g.count1()
  16. 该类一共实例化了5个对象。
  17. >>> f.count1()
  18. 该类一共实例化了4个对象。
复制代码


新手望指教!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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