Python类可以区分输入类型吗?

时间:2015-04-10 01:33:49

标签: python class

例如在Python类中,我可以使用两种不同的添加方法来检测我是将对象添加到整数,还是将对象添加到另一个对象,或者是对象和字符串等?

3 个答案:

答案 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检查对象是否属于特定类型。