实例方法
class MyClass:
def instance_method(self,name):
self.name = name #设置传入实例的name属性
print(self,'调用了实例方法~')
MyClass中的instance_method就是一个常规的实例方法。实例方法接受至少一个以上的参数,且第一个参数必须是实例对象,该参数名一般约定为self(可以修改但是不建议修改),它在调用方法时指向实例对象本身。
通过self参数,实例方法可以自由访问同一实例对象上的属性和其他方法来修改实例对象的状态。
它们不仅可以修改实例对象的状态,实例方法还可以通过self ._ class_属性访问类本身。这意味着实例方法也可以修改类状态。
现在我们调用实例方法来看看效果:
obj = MyClass() #创建一个MyClass类的实例obj
obj.instance_method("trophy") #使用实例对象obj调用实例方法
print(obj.name) #输出obj对象的name属性
MyClass.instance_method(obj,"jack") #使用类对象MyClass调用实例方法
print(obj.name) #输出obj对象的name属性
#输出结果:
#<__main__.MyClass object at 0x0000008C05830358> 调用了实例方法~
#trophy
#<__main__.MyClass object at 0x0000008C05830358> 调用了实例方法~
#jack
SO,我们可以:
使用类的实例对象(obj)调用实例方法,这是最方便也最常用的调用方式。在执行obj.instance_method()时,只需传入self之后的参数name,因为Python会自动将实例对象obj作为self参数。
使用类对象(MyClass)调用实例方法,虽然可行但是实际上几乎不会用。使用时必须传入完整的参数,此处包括实例对象(本例中为obj)作为self参数以及name参数,否则会报出TypeError。
总结:实例方法,顾名思义就是实例的方法,无论使用哪种方式调用,实际上都是传入一个实例然后对该实例对象的属性或者状态进行更改。平时我们对类实例对象的一些操作都是在实例方法中完成的。
类方法
class MyClass:
__number = 0 #类属性
@classmethod
def class_method(cls):
cls.__number +=1 #修改类属性
print(cls,'调用了类方法~ 此时类属性number = ',cls.__number)
MyClass中的class_method就是一个类方法。类方法接受至少一个以上的参数,且第一个参数必须是当前类对象,该参数名一般约定为cls(可以修改但是不建议修改),它在调用方法时指向类本身。此外,我们还需要用@classmethod装饰器将它标记为类方法。
因为类方法只能访问cls参数,所以它无法通过self来修改对象实例状态。但是,类方法仍然可以修改适用于所有类实例的类状态。
现在我们调用类方法来看看效果:
obj = MyClass() #创建一个MyClass类的实例obj
obj.class_method() #使用实例对象obj调用类方法
MyClass.class_method() #使用类对象MyClass调用类方法
#输出结果:
#<class '__main__.MyClass'> 调用了类方法~ 此时类属性number = 1
#<class '__main__.MyClass'> 调用了类方法~ 此时类属性number = 2
SO,我们可以:
使用类的实例对象(obj)调用类方法。
使用类对象(MyClass)调用类方法。
总结:类方法,顾名思义就是类的方法,可以直接使用类来调用或者是使用该类的任意实例对象来调用。实际上都是传入一个类对象然后对该类的属性或者状态进行更改。当我们要对与整个类相关而不需要具体到某个实例上的属性进行操作时,就可以通过设计类方法来实现。
静态方法
class MyClass:
@staticmethod
def static_method():
print('调用了静态方法~')
MyClass中的static_method就是一个静态方法,我们需要用@staticmethod装饰器将它标记为静态方法。
静态方法参数随意,相比实例方法和类方法不再有self和cls参数的限制,因此静态方法既不能修改对象实例的状态也不能修改类的状态。当然,它可以自由地接受任意数量的其他参数。
现在我们调用静态方法来看看效果:
obj = MyClass() #创建一个MyClass类的实例obj
obj.static_method() #使用实例对象obj调用静态方法
MyClass.static_method() #使用类对象MyClass调用静态方法
#输出结果:
#调用了静态方法~
#调用了静态方法~
SO,我们可以:
使用类的实例对象(obj)调用静态方法。
使用类对象(MyClass)调用静态方法。
总结:静态方法,虽然在类中定义、逻辑上是属于类的,但是和该类的性质并没有多大的关系。静态方法中都是一些不会涉及到类中的属性和方法的操作,所以我们可以认为静态方法仅仅是托管于某个类的名称空间中,便于使用和维护的功能函数。
参考文献:Python’s Instance, Class, and Static Methods Demystified