call方法
class A:
def __init__(self, a, b):
self.a = a
self.b = b
def __call__(self,a,b):
print("123call",a,b)
a = A(1,2)
a(3,4) #相当于把实例变一个函数
print(a.a,a.b)
不得不引发出call和其他类方法的区别:
实例化方法
实例化的方法就是普通的类方法,它表达了类功能的多样性和抽象性,传入参数是self,使用场景必须是先实例化,在调用此方法。但实例化方法也是调用call,就是a.do_something.__call()。
class A:
def __init__(self, a, b):
self.a = a
self.b = b
def do_normal_something(self, a, b):
print("do_normal_something",a,b)
@staticmethod
def do_something():
pass
@classmethod
def do_class_something(cls):
pass
def __call__(self,a,b):
print("123call",a,b)
a = A(1,2)
a.do_normal_something(7,8)
静态方法
@staticmethod也是一个类方法,是可以直接类调用的。个人认为的使用场景是:只要要定义的方法里不涉及到self参数,就用静态方法承担。因为这样就表明这个方法和本身的类没有关系,明确的区别出类相关和不相关。
class A:
def __init__(self, a, b):
self.a = a
self.b = b
def do_normal_something(self, a, b):
print("do_normal_something",a,b)
@staticmethod
def do_static_something(a,b):
print('do_static_something',a,b)
@classmethod
def do_class_something(cls):
pass
def __call__(self,a,b):
print("123call",a,b)
a = A(1,2)
a.do_normal_something(7,8)
a.do_static_something(5,6)
类方法
@classmethod是区别与@staticmethod的又一个类方法,也是类直接可调用的。它接受的第一个参数是cls,传入类的用途就是为了init不足而构造新对象。比如工厂模式,不断的用classmethod方法创造新产品,每个classmethod就像一条流水线,生产出来新的产品对象,供使用者拿去使用。而且因为不用实例化,写法也比较优雅。
另外,classmethod可以作为实现的窗口函数。先将要实现的功能全部抽象化,然后写在调用处实现窗口。之后通过子类的重写参数以及修改需要的逻辑方法,就可以在不改变代码的情况下通过继承来展示类的多态,也符合对象的多继承少修改原则。
类方法详解跳转至我的另外一篇专门写classmethod的文章:https://blog.youkuaiyun.com/EMIvv/article/details/122482756