Discuss / Python / 什么是多态?‘动态语言’和’静态语言‘又是什么回事?

什么是多态?‘动态语言’和’静态语言‘又是什么回事?

Topic source

上面讲到多态的时候,写了4个例子,4个例子不都是完全一样嘛? 几个子类里都有run方法,调用的时候当然没问题了啊,按理来说,就算没有继承父类,只要正确定义了run方法,它就应该正常调用。这跟多态有什么关系? 什么样才是多态? 还有,这几个类里面都有run方法,静态动态语言应该都可以调用吧?除非run方法写错,没有继承父类也乱写进去,不出错才怪。(虽然我不太懂什么静态动态语言,但这不科学啊)不明白,不明白啊。 有没有大神给解惑一下? 这章节中的例子,class Animal(object):这个类名不是开头大写吗,那么animal是什么?这应该是一个参数名吧?然后,为什么要写两个一样的animal.run(),一定要写两个吗?我真是有些被误导了。 def run_twice(animal): animal.run() animal.run()

奇楠之后

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

动态语言,变量指向的数据类型是可变的,比如 a=123,a='123' ,先后指向两种不同的数据类型。静态语言就是指向不可变,比如C语言,使用一个变量,一定先要定义并申明它的数据类型 int a =123;那么变量a就只能指向整形数据。animal是一个位置参数,参数可以是任何的数据类型,类是我们自定义的数据类型。两个animal.run() 应该是突出强调的意思,没其他作用。。。多态,创建一个父类Animal,再定义诸多子类继承这个父类,每个子类都获得父类的属性方法。每个子类还可以在自己的Class内部增加方法,或者重写方法,这样就呈现多态。。。新手上路,理解错了,希望大神指出,谢谢。

所以学Python之前,最好懂一门静态语言,不然以后再学静态语言,很多东西都会打架。 和静态语言相比,Python的多态更宽松而已,宽松到没有原则,这就是动态语言的特点。

1. 多态

一个方法,多种形态,就是多态。可以简单的这么理解。

一个run方法,可以被继承它的类 替换 或者 不替换。(其实多态就是一种说法,就是一些形式,大家为它起了一个名字。)

还有 方法名一样,接收的参数不同,也成为 多态。这个也适用于我开头的第一句话。比如:

def hello(name):
    pass

def hello(name, age):
    pass

2. 这几个类里面都有run方法,静态动态语言应该都可以调用吧

在静态语言里,所有的对象前面都必须指定类型,所以在写方法的时候参数就已经被指定了。比如:

// 传入的参数必须是 Person 对象,或者继承 Person 的实例
public void getName(Person p){
}

但是在 python 中,如下:

// 这个方法接收的参数,可以是任何类型的
def get_name(p):
    pass

看出这两个的区别了把? 所以有了文章最后说的“鸭子类型”,在 python 中“看起来像鸭子,走起路来像鸭子”,你就可以是鸭子。就是说,只要你传入的类有个方法,代码就可以执行。 但是在静态语言中 “你必须是鸭子” 代码才可以执行。

3. def run_twice(animal): 里面的参数

这里的 animal 就是一个参数而已,写什么都可以,写 a、b、c 都没有问题。 这里为了“见名思义”,所以写成 animal 。

4. 调用两遍

作者觉得好玩,所以就调用了两遍。 这里调用几遍都无所谓了,调用类的方法呗,想只要传进来的类有这个方法,随便调。

给楼上个赞~


  • 1

Reply