You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类中未传递参数的默认函数类型是什么?自定义类中无装饰器方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:57:35