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

基类定义装饰器子类使用时触发TypeError: bilolgy()缺少self参数求助

解决装饰器调用时的TypeError: bilolgy() missing 1 required positional argument: 'self'问题

嘿,我来帮你搞定这个问题!你遇到的错误其实有两个核心原因,咱们一步步拆解解决:

问题根源

你用@Base.bilolgy(pre="Cats")直接调用基类的bilolgy方法,但bilolgy是实例方法——它的第一个参数self需要接收一个Base类的实例,可你直接用类名调用时并没有传递这个实例,所以Python报错说缺少self参数。另外,你装饰的cat是子类的实例方法,装饰器内层的color函数没处理self参数,就算前面的问题解决了,后面调用sub.cat("cat")还是会出错。

解决方案1:把bilolgy改成类方法

给bilolgy加上@classmethod装饰器,这样它的第一个参数会变成cls(代表当前类),用类名调用时Python会自动传入这个参数,同时调整内层函数接收self:

class Base(object):
    """ base class """
    @classmethod
    def bilolgy(cls, pre):
        def animal(func):
            # 必须加self,因为被装饰的是实例方法
            def color(self, a):
                print(pre)
                print("Today is a good day")
                func(self, a)
            return color
        return animal

class Sub(Base):
    """ subclass """
    @Base.bilolgy(pre="Cats")
    def cat(self, name):
        print("This is a " + name)

if __name__ == '__main__':
    sub = Sub()
    sub.cat("cat")

运行这段代码,就能正常输出:

Cats
Today is a good day
This is a cat

解决方案2:把bilolgy改成静态方法

如果不需要用到类或实例的属性,也可以用@staticmethod装饰bilolgy,它不需要类/实例作为第一个参数,同样要记得给内层函数加self:

class Base(object):
    """ base class """
    @staticmethod
    def bilolgy(pre):
        def animal(func):
            def color(self, a):
                print(pre)
                print("Today is a good day")
                func(self, a)
            return color
        return animal

class Sub(Base):
    """ subclass """
    @Base.bilolgy(pre="Cats")
    def cat(self, name):
        print("This is a " + name)

if __name__ == '__main__':
    sub = Sub()
    sub.cat("cat")

关键修改点说明

  • 类方法/静态方法支持直接通过类名调用,不需要先创建实例,完美解决了self参数缺失的问题。
  • 被装饰的cat是实例方法,调用时Python会自动把sub实例作为第一个参数传给装饰器的内层函数color,所以color必须接收这个self参数,才能把它传递给原函数cat。

内容的提问来源于stack exchange,提问作者Kevin_ZZZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:05:57