这有资格作为多态吗?

时间:2016-10-27 23:09:26

标签: python polymorphism

我试图掌握多态的概念,我有点理解它在OOP的背景下是什么,但是我已经读到它也可以应用于程序编程而且我不知道真的明白了怎么做。

我知道Python中有很多方法和操作符,例如,它们已经使用了多态,但是我编写的函数是多态的?例如,下面的函数what_type是否会被认为是多态的,因为根据定义,它根据所接受的参数的数据类型有不同的行为,或者这只是一个带有条件语句的函数的常规示例?

def what_type(input_var):
    'Returns a statement of the data type of the input variable'

    # If the input variable is a string
    if type(input_var) is str:
        this_type = "This variable is a string!"

    # If it's an integer
    elif type(input_var) is int:
        this_type = "This variable is an integer!"

    # If it's a float
    elif type(input_var) is float:
        this_type = "This variable is a float!"

    # If it's any other type
    else:
        this_type = "I don't know this type!"


    return this_type

2 个答案:

答案 0 :(得分:1)

也许它可以被认为是一种相当无趣的ad-hoc多态性的例子,但它并不是大多数人在谈论多态时所想到的那种。

除了你似乎有点习惯的OOP风格的多态性之外,Python还有一个有趣的基于协议的多态性。例如,iterators是实现__next__()方法的对象。您可以编写适用于任何迭代器的多态函数。例如,如果你想将两个迭代器包装成一个在两者之间交替的迭代器,你可以这样做:

def alternate(source1,source2):
    for x,y in zip(source1,source2):
        yield x
        yield y

这可以应用于字符串:

>>> for item in alternate("cat","dog"): print(item)

c
d
a
o
t
g

但它可以同样适用于例如两个可供阅读的文件。

这种多态代码的重点是你真的不关心传递给它的迭代器类型。只要它们是迭代器,代码就会按预期工作。

答案 1 :(得分:-1)

what_type正在检查参数的类型并决定如何自己处理它。 它不是多态,也不是oop。

在oop中,what_type不应该关注参数的具体类型,参数应该处理特定于类型的行为。 因此,what_type应该写成:

def what_type(input_var):
    input_var.print_whats_myself()