Discuss / Python / 一点见解

一点见解

Topic source

小城2014

#1 Created at ... [Delete] [Delete and Lock User]

文中说的: 要理解多态的好处,我们还需要再编写一个函数,这个函数接受一个Animal类型的变量:

这里有种误导,首先这个函数:

def run_twice(animal):

虽然参数的名字为animal,但是python并不能限制它是Animal类型的变量,这个变量名字即使为a,为b都可以,所以在执行方法时,调用的是这个变量的run方法,所以 只要有run方法都可以成功。

所以对于下面的话,也是因为静态语言对参数做了限制,如果python在函数体里使用isinstance(animal, Animal)做判断也可以起到静态语言的效果。

对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。

对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了

zjdddlll

#2 Created at ... [Delete] [Delete and Lock User]

对对我看这一块的时候也觉得有些难以理解,总觉得哪个地方点点不对劲。

kingsley_磊

#3 Created at ... [Delete] [Delete and Lock User]

对的,差点被误导了

对的,其实这里的animal更像是个占位参数对象,只要你传入的对象中有run方法就可以运行。

black度厄

#5 Created at ... [Delete] [Delete and Lock User]

确实,这个变量名有误导性,动态语言不提供静态语言提供的类型安全特性**,**因此python可以实现“鸭子类型”,java等静态语言由于编译时候进行类型检查,会针对对象进行检查有没有该方法,编译时期即报错。

说的对,要强调类型可以用

def run_twice(animal: Animal):

但同样的,这里的类型不是强制的

感谢感谢!

lng205

#8 Created at ... [Delete] [Delete and Lock User]

学到了

UP

#9 Created at ... [Delete] [Delete and Lock User]

感谢感谢,学到了,就是不明白这里

这个例子更适合解释后面的鸭子类型,鸭子能跑,有run方法,实参形参animal也有run方法,那么animal就是鸭子


  • 1

Reply