python中关于类方法,静态方法,实例方法的调用及参数传参问题

今天看到一个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结构,如果只是单独编写某个方法,这些方法也是可以相互调用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值