类中未传递参数的默认函数类型是什么?自定义类中无装饰器方法c()的类型判定
关于Python类中无参数方法的类型疑问解答
先看你给出的代码示例:
class A: @classmethod def a(x): print('a') @staticmethod def b(): print('b') def c(): print('c') def d(self): #instance method print(self) A.a() # calling using class A.b() # calling using class A().b() # calling using instance A.c() # calling using class A().d() # calling using the object A().c() # calling using instance but returning error
咱们来逐个拆解你的疑问:
一、方法c()属于什么类型?
其实它是一个定义错误的实例方法,具体原因如下:
- 当你用类直接调用
A.c()时,本质是直接调用了这个函数对象,Python不会给它自动传递任何参数,刚好c()定义时没有参数,所以能正常执行。 - 但用实例调用
A().c()时,Python会遵循实例方法的规则:自动把当前实例作为第一个参数传递给这个方法。可c()定义时没有预留接收参数的位置,这就导致了「参数不匹配」的错误——这也是它和静态方法的核心区别:静态方法加了@staticmethod装饰器,Python不会给它自动传参,所以实例调用也没问题;而c()没加装饰器,被Python默认当作实例方法处理,实例调用时强行传参就报错了。
二、类内部未传递参数的函数默认是什么类型?
类里定义的函数,默认是实例方法,但你写的这种无参数的写法是不符合实例方法规范的。
正常的实例方法必须定义第一个参数(通常命名为self,名字可以自定义),用来接收调用它的实例对象。如果没写这个参数,比如c(),虽然Python依然把它当作实例方法,但实例调用时必然会因为参数不匹配报错,只有用类直接调用时(相当于跳过实例方法的自动传参逻辑)才能运行,这其实是一种不规范的写法,实际开发中一定要避免。
内容的提问来源于stack exchange,提问作者Krishna M
相关产品推荐
相关产品推荐

