基类定义装饰器子类使用时触发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
相关产品推荐
相关产品推荐

