Pyhton 实例方法,类方法,静态方法的区别



实例方法和类方法的区别

有区别的,最主要的区别在于,定义类方法主要是要加一个装饰器,@classmethod
而实例方法没有这个装饰器。这是区别实例方法和类方法的最主要的区别。
在调用上的区别在于,实例方法要先实例化一个对象再调用这个实例化方法,而类方法不需要有类的实例,直接类名.方法名就可以调用。
实例方法至少有一个参数,通常用self,这个参数里面是这个实例本身。类方法至少有一个参数,通常用cls,这个参数里面是这个类本身。
实例方法由于有实例,所以实例的属性对其实可见的,但类方法显然没有属性。
本质上来讲,类方法和实例方法没有本质区别,只不过在调用的时候,实例方法把这个实例本身当做参数传过去了。
以下是示例代码,感受一下。
class myclass:
    @classmethod
    def classMethod(cls):
        print('class method')
        print('parameter : %s'%cls)
        pass
    def instanceMethod(self):
        print('instance method')
        print('parameter : %s' % self)
        pass
m=myclass()
m.instanceMethod()#实例来调用实例方法
myclass.classMethod()#类名.方法名调用类方法
myclass.instanceMethod(m)#类名.方法名,并将实例作为参数传入,和实例调用实例方法一样


类方法和静态方法的区别

面相对象程序设计中,类方法和静态方法是经常用到的两个术语。

逻辑上讲:类方法是只能由类名调用;静态方法可以由类名或对象名进行调用。

在C++中,静态方法与类方法逻辑上是等价的,只有一个概念,不会混淆。

而在Python中,方法分为三类实例方法、类方法、静态方法。代码如下:

 class Test(object):

def InstanceFun(self):

        print("InstanceFun");

        print(self);

@classmethod

    def ClassFun(cls):

        print("ClassFun");

        print(cls);

@staticmethod

    def StaticFun():

        print("StaticFun");

t = Test();       

t.InstanceFun();      # 输出InstanceFun,打印对象内存地址“<__main__.Test object at 0x0293DCF0>”

Test.ClassFun();                       # 输出ClassFun,打印类位置 <class '__main__.Test'>

Test.StaticFun();                        # 输出StaticFun

t.StaticFun();                              # 输出StaticFun

t.ClassFun();                             # 输出ClassFun,打印类位置 <class '__main__.Test'>

Test.InstanceFun();                  # 错误,TypeError: unbound method
instanceFun() must be called with Test instance as first argument

Test.InstanceFun(t);                 # 输出InstanceFun,打印对象内存地址“<__main__.Test object at 0x0293DCF0>”

t.ClassFun(Test);                      # 错误   classFun() takes exactly 1 argument (2 given)  

可以看到,在PYTHON中,两种方法的主要区别在于参数。实例方法隐含的参数为类实例self,而类方法隐含的参数为类本身cls。
静态方法无隐含参数,主要为了类实例也可以直接调用静态方法。

  所以逻辑上类方法应当只被类调用,实例方法实例调用,静态方法两者都能调用。主要区别在于参数传递上的区别,实例方法悄悄传递的是self引用作为参数,而类方法悄悄传递的是cls引用作为参数。

  Python实现了一定的灵活性使得类方法和静态方法,都能够被实例和类二者调用





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值