欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Pyhton的实例方法、类方法、静态方法三者的区别

程序员文章站 2022-07-02 19:14:16
实例方法和类方法的区别 有区别的,最主要的区别在于,定义类方法主要是要加一个装饰器,@classmethod 而实例方法没有这个装饰器。这是区别实例方法和类方法的最主要的区别。...

实例方法和类方法的区别

有区别的,最主要的区别在于,定义类方法主要是要加一个装饰器,@classmethod

而实例方法没有这个装饰器。这是区别实例方法和类方法的最主要的区别。

在调用上的区别在于,实例方法要先实例化一个对象再调用这个实例化方法,而类方法不需要有类的实例,直接类名.方法名就可以调用。

实例方法至少有一个参数,通常用self,这个参数里面是这个实例本身。类方法至少有一个参数,通常用cls,这个参数里面是这个类本身。

实例方法由于有实例,所以实例的属性对其实可见的,但类方法显然没有属性。

本质上来讲,类方法和实例方法没有本质区别,只不过在调用的时候,实例方法把这个实例本身当做参数传过去了。

以下是示例代码,感受一下。

classmyclass:

@classmethod

defclassMethod(cls):

print('classmethod')

print('parameter:%s'%cls)

pass

definstanceMethod(self):

print('instancemethod')

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,打印类位置

Test.StaticFun(); # 输出StaticFun

t.StaticFun(); # 输出StaticFun

t.ClassFun(); # 输出ClassFun,打印类位置

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实现了一定的灵活性使得类方法和静态方法,都能够被实例和类二者调用