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

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有什么区别

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