例如在Python类中,我可以使用两种不同的添加方法来检测我是将对象添加到整数,还是将对象添加到另一个对象,或者是对象和字符串等?
答案 0 :(得分:2)
查看multipledispatch模块。
这是一个粗略但简单的使用示例。您可以看到它可以根据参数类型调度到不同的方法。它还可以处理不同数量的参数。
from multipledispatch import dispatch
class Adder(object):
@dispatch(object, int)
def add(o, i):
print 'add(object, int):'
return int(o) + i
@dispatch(object, basestring)
def add(o, s):
print 'add(object, string):'
return str(o) + s
@dispatch(int, int)
def pow(a, b):
print 'pow(int, int):'
return a**b
@dispatch(int, int, int)
def pow(a, b, c):
print 'pow(int, int, int):'
return a**b**c
>>> a = Adder()
>>> a.add(1, ' one')
add(object, string):
'1 one'
>>> a.add(100, 1)
add(object, int):
101
>>> a.pow(2, 2)
pow(int, int):
4
>>> a.pow(2, 2, 2)
pow(int, int, int):
16
答案 1 :(得分:2)
Python对象有特殊方法。特殊方法只是与type
打包在一起的方法。例如,int
类型具有__add__()
特殊方法,该方法采用一个参数。 int.__add__(5)
将为int
添加5(实际数字是对象的错误示例,但int
是可用于此示例的对象类型)。你经常在这样的代码中看到这个:
a = 10 + 5
有点像
a = 10.__add__(5)
不是最好的例子,我知道。
您可以使用方法
创建自己的类__add__(self, value)
并且在该方法中,您可以检查type
value
是什么,通常是isinstance()
。如果你在__add__()
方法中检查各种类型,那么你就是在做多态。像Python这样的多态性在Python世界中通常是不受欢迎的。为什么呢?
如果你有一个名为Car
的类和一个名为car
的类的实例,那么car = car + 5
是什么意思?如果我们添加car + 'Sammy drives'
,应该print(car)
打印什么?
如果需要将一种类型的数据应用于对象,将另一种类型的数据应用于同一对象,则通常更清楚的是将每种数据类型应用于该对象的特定属性。像这样:
car.speed = car.speed + 5
car.driver = 'Sammy'
另外,我建议您了解鸭子类型。如果你擅长它,那么检查代码类型中的对象类型就会消失。
答案 2 :(得分:-2)
是的,您可以使用isinstance
检查对象是否属于特定类型。