今天看到一个bug,明白了其中的原理之后对类方法,实例方法,静态方法的传参及调用有了更深刻的体会。
后面自己写了一个demo,复现了这个报错
报错提示为:TypeError: fun() missing 1 required positional argument: 'value'
下面是demo的代码:
class Demo:
def __init__(self, id: int, value: int):
self.value = value
self.id = id
def fun(self, id, value):
print("self:", id, value)
@classmethod
def fun2(cls, id, value):
print("cls:", id, value)
@staticmethod
def fun3(id, value):
print("static:", id, value)
def get_value(self):
self.fun(self.id, self.value)
if __name__ == '__main__':
id = 1
value = 2
Demo.fun(id, value) # TypeError: fun() missing 1 required positional argument: 'value'
Demo.fun2(id, value) # cls: 1 2
Demo.fun3(id, value) # static: 1 2
demo = Demo(id, value)
demo.fun(id, value) # self: 1 2
Demo(id, value).fun(id, value) # self: 1 2
Demo.get_value() # TypeError: get_value() missing 1 required positional argument: 'self'
Demo(id, value).get_value() # self: 1 2
定义了一个Demo类,有初始化函数,以及相应的其他类别的方法
普通的实例方法在调用时必须先实例化,即只有类的实例才能直接调用。
静态方法和类方法都可以直接通过类名来调用。
Demo.fun(id, value)
和Demo(id, value).fun(id, value)
区别就是后者先进行了实例化,在用类的实例去调用实例方法。而前者直接通过这个类去调用。
使用了装饰器@classmethod
, @staticmethod
之后,类所属的方法就分别变成了类方法和静态方法,可以直接调用。
平常用的比较多的就是实例方法和类方法,实际应用中,可以把类方法作为公共方法,不过现在的项目大部分是MVC结构,如果只是单独编写某个方法,这些方法也是可以相互调用的。