day10_修改父类的构造方法(不重要)和鸭子类型

当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子
在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭的对象,并调用它的走和叫方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。

class Duck():
def walk(self):
print('I walk like a duck')

def swim(self):
print('I swim like a duck')


class Person():
def walk(self):
print('This one walk like a duck')

def swim(self):
print('This man swim like a duck')


def watch_duck(animal): # animal叫别的名字也可以,在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。
animal.walk() # 只有walk方法,只调用类中的walk方法
animal.swim() # 只有swim方法,只调用类中的swim方法

small_duck = Duck()
watch_duck(small_duck)

duck_like_man = Person()
watch_duck(duck_like_man)


class Lame_Foot_Duck():
def swim(self):
print('I am lame but i can swim')


lame_duck = Lame_Foot_Duck()
watch_duck(lame_duck) # watch_duck函数接收这个类的对象,然后并没有检查对象的类型,而是直接调用这个对象的走和游的方法,如果所需要的方法不存在就报错(类中没有walk方法,所以报错)


父类的构造方法,满足不了你现有的功能,你要在父类构造方法的基础上,添加新的功能

class AxFather(object):
def __init__(self, op):
print('这个是父类里面的op:', op)

def make_money(self):
print('今天挣了100万')


class Ax(AxFather):
def __init__(self, op, code):
AxFather.__init__(self, op) # 把原来的调用一下,有父类的功能,方法一,如果想修改父类的构造方法,那么先调用一下父类的构造方法
super(Ax, self).__init__(op) # super会自动帮你找到父类,方法二,这个和上面的写法是一样的,不一样的是super里传的是本类,而不是父类
print('这个是Ax类里面的code:', code)

def make_money(self):
print('今天挣了290万')


Ax('吃饭', '喝水')

分别打印如下:
这个是父类里面的op: 吃饭
这个是Ax类里面的code: 喝水

 

python里面是不支持多态的

class My(object):
def make(name):
print(name)

def make(name, age):
print(name, age)

def make():
print('哈哈')

java里是通过多个make方法,通过不同的形参来实现多态
功能比较简单的情况下,定义个函数就行,功能比较复杂的就用类,更好些

posted @ 2018-03-17 18:36  laosun0204  阅读(206)  评论(1编辑  收藏  举报