勃艮第red 2021-08-11 11:30 采纳率: 63.6%
浏览 34

类中不使用修饰符定义函数,为什么无法被实例调用却可以被类调用

class A():
    @classmethod
    def b_print(cls):
        print('BBB')
    @staticmethod
    def c_print():
        print('CCC')
    def a_print(self):
        print('AAA')
    def d_print():
        print('DDD')

针对不使用修饰符定义的函数d_print()
A.d_print() # DDD
a.d_print() # d_print() takes 0 positional arguments but 1 was given
为什么实例调用会自动传入self参数,类调用不会?

A.c_print
#<function __main__.A.c_print()>
A.d_print
#<function __main__.A.d_print()>

而且从类型上也不知道d_print和使用static修饰符的c_print有什么区别

  • 写回答

1条回答 默认 最新

  • CSDN专家-HGJ 2021-08-11 13:36
    关注

    可以这么理解:类实例调用基本方法,在用a.d_print()实例化调用类方法时,实例对象创建后,实例便会代替 self,self 是所有实例的替身,传参时被忽略了,但是他是存在的,实际就是传入了self,而在类中该方法没有参数,所以会报传入参数错误。通过用静态方法装饰后,就能既通过类调用,也可通过实例调用。参考@staticmethod说明。

    评论

报告相同问题?

问题事件

  • 修改了问题 8月11日
  • 修改了问题 8月11日
  • 修改了问题 8月11日
  • 创建了问题 8月11日

悬赏问题

  • ¥15 远程访问linux主机超时
  • ¥15 odoo17存货管理优势于中国国内该行业传统ERP或MES的详细解读和举例
  • ¥15 CPU卡指令整合指令数据都在图片上
  • ¥15 火车票关联12306问题
  • ¥15 odoo17处理受托加工产品
  • ¥15 如何用MATLAB编码图三的积分
  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES
  • ¥15 结构功能耦合指标计算