Python类方法,静态方法和实例方法区别

静态方法:
是指类中无需实例参与即可调用的方法(不需要self参数),在调用过程中,无需将类实例化,直接在类之后使用.号运算符调用方法。要用@staticmethod装饰器,否则实例调用会报错,因为类实例在调用func_a时,会隐式地将self参数传入func_a,而func_a本身不接受任何参数,从而引发异常。

class ClassA(object):

    @staticmethod
    def func_a():
        print('Hello Python')

if __name__ == '__main__':
    ClassA.func_a()
    # 也可以使用实例调用,但是不会将实例作为参数传入静态方法
    ca = ClassA()
    ca.func_a()


class ClassA(object):


    def func_a():
        print('Hello Python')

if __name__ == '__main__':
    ClassA.func_a()
    # 以下使用实例调用会引发异常,因为调用非静态方法会往函数传参数,但是静态函数不接收参数
    ca = ClassA()
    ca.func_a()

类方法:
在Python中使用比较少,类方法传入的第一个参数为cls,是类本身。并且,类方法可以通过类直接调用,或通过实例直接调用。但无论哪种调用方式,最左侧传入的参数一定是类本身。通常情况下,类方法使用@classmethod装饰器来声明。如果存在类的继承,那类方法获取的类是类树上最底层的类,因此需要明确调用类属性时,不要使用类方法传入的cls参数,直接调用类名。

class BaseA(object):

    @classmethod
    def func_a(cls):
        print(type(cls), cls)


class BaseB(object):
    pass


class ClassA(BaseA, BaseB):
    pass


if __name__ == '__main__':

    ClassA.func_a()

    ca = ClassA()
    ca.func_a()
<class 'type'> <class '__main__.ClassA'>
<class 'type'> <class '__main__.ClassA'>

实例方法:
除静态方法与类方法外,类的其他方法都属于实例方法。实例方法需要将类实例化后调用,如果使用类直接调用实例方法,需要显式地将实例作为参数传入。最左侧传入的参数self,是实例本身。

class ClassA(object):

    def func_a(self):
        print('Hello Python')

if __name__ == '__main__':
    # 使用实例调用实例方法
    ca = ClassA()
    ca.func_a()
    # 如果使用类直接调用实例方法,需要显式地将实例作为参数传入
    ClassA.func_a(ca)

使用场景举例
参考博文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值