python类多态是对class类只能通过__init__构造方法初始化的补充,通过类多态对不同的数据进行初始化可以更方便的构建工厂模式,同时配合python3.8的functools.singledispatchmethod修饰器可以自动根据数据类型将实例初始化,增强代码可读性和扩展性.

import functools

class Vector:
def __init__(self,x,y):
self.x = x
self.y = y

class A:
def __init__(self,val):
self.val = val

def function(self):
print(self.val**2)

@classmethod
def normal_string(cls,val):
val = int(val)
return cls(val)

# classmethod解决了一般的类只能__init__初始化的问题,通过singledispatchmethod单分派指定参数类型进行分配
@functools.singledispatchmethod
@classmethod
def string_to(cls,val):
print("输入格式错误")

# 注册string_to,指定参数val:类型为str
@string_to.register
@classmethod
def _(cls,val:str):
val = int(val)
return cls(val)

@string_to.register
@classmethod
def _(cls,val:int):
return cls(val)

@string_to.register
@classmethod
def _(cls,val:bool):
val = int(val)+5
return cls(val)

@string_to.register
@classmethod
def _(cls,val:Vector):
val = (val.x**2 +val.y**2)**0.5
return cls(val)

A(6).function() #一般的实例化调用方法
A.normal_string("54").function() #单独的@classmethod实现
A.string_to("4").function() [email protected][email protected]根据val:TypeType类型自动分配(str)
A.string_to(False).function()#同上(bool)
A.string_to(15).function()#同上(int)
A.string_to(Vector(3,4)).function()#同上(自定义数据类型Vector)