Python 实例方法、静态方法、类方法的区别
一、实例方法:
实例方法(instance method)第一个参数为self。该方法也是最常见的。
class Dog(object):
def __init__(self, name):
self.name = name
def eat(self):
"""创建一个实例方法"""
print('{}正在吃便便'.format(self.name))
dog = Dog('fe_cow')
dog.eat()
# 输出结果:fe_cow正在吃便便
eat()为一个实例方法,实例方法第一个参数为self,当dog.eat()调用实例方法时,实例dog传递给self参数,这也self就可以引用当前调用实例方法的实例
。
二、静态方法:
静态方法(static method),使用装饰器@staticmethod
来定义一个静态方法,不需要参数self
。静态方法属于类,但是和实例无关
。
class Dog(object):
age = 18
def __init__(self, name):
self.name = name
@staticmethod
def eat():
"""创建一个静态方法"""
print('__执行静态方法__')
return Dog.age
dog = Dog.eat()
print(dog)
# 执行结果:
__执行静态方法__
18
在Dog类中,定义了一个类属性age,每次调用eat()这个静态方法的时候都返回这个类属性,但是有一个问题如果我这个类名变了,变成了Cat的话,那么我需要将该静态方法的返回改成return Cat.age
,比较麻烦,这时可以用类方法解决。
三、类方法:
类方法(class method),使用装饰器@classmethod
来定义一个类方法,至少传入一个cls参数(参数名命可以是其他的,但是遵守Python规则建议使用cls参数名),执行类方法时,自动将调用该方法的类赋值给cls参数
。
class Dog(object):
age = 18
def __init__(self, name):
self.name = name
@classmethod
def eat(cls):
"""创建一个类方法"""
print('__执行类方法__')
return cls.age
dog = Dog('fe_cow').eat()
print(dog)
# 输出结果如下:
__执行类方法__
18
使用类方法,就可以解决上述使用静态方法出现的问题,当类名改变,不比再次修改类名的问题。
四、以上方法的区别:
实例方法:调用时会把实例dog
作为第一个参数传递给self
参数,因此调用dog.eat()
静态方法:调用时不需要传递类或实例
,可以通过类或实例来调用
,调用实例Dog('fe_cow').eat()或dog.eat()
类方法:调用时会把类Dog
作为第一个参数传递给cls
参数,调用实例Dog('fe_cow').eat()或dog.eat()
。
类实例/类 | 实例方法 | 静态方法 | 类方法 |
---|---|---|---|
dog = Dog(‘fe_cow’) | dog.eat() | dog.eat() | dog.eat() |
Dog(‘fe_cow’) | 没有 | Dog(‘fe_cow’).eat() | Dog(‘fe_cow’).eat() |