面向对象之 继承(子类对象调用父类的方法,钻石继承以及面试题) 多态简介

#继承 :一般到具体
# 抽象:具体到一般
# 先抽象后继承
# 继承有几种:单继承 多继承
# 以下是继承父类的方法演示
# class Animal:
# def eat(self):
# print("eating")
#
# def drink(self):
# print("drinking")
#
# def sleep(self):
# print("sleeping")
#
# class Cat(Animal):
# def catch_mouse(self):
# print("yeah")
#
# class Dog(Animal):
# def watch_door(self):
# print("wangwang")
#
# kitty = Cat()
# kitty.eat()
# snoopy = Dog()
# snoopy.eat()
# 上节课 人类 狗类相同的属性 提取了一个__init__方法,在这个方法里放一些共同的属性
# 本节课 猫类和狗类 相同的方法 直接把相同的方法提取出来 放在基类里

# 人 狗 相同属性的时候 还有一些不同的属性
# class Animal:
# def __init__(self,name, aggressivity,life_value):
# self.name = name # 每一只狗都有自己的昵称;
# self.aggressivity = aggressivity # 每一只狗都有自己的攻击力;
# self.life_value = life_value
# def eat(self):
# self.life_value+=10
#
# class Dog(Animal): # 定义一个狗类
# def __init__(self, name, breed, aggressivity, life_value):
# Animal.__init__(self, name, aggressivity, life_value)
# # super().__init__(self, aggressivity, life_value,name)#新式类
#
# self.breed = breed # 每一只狗都有自己的品种;#派生属性 父类没有的方法
#
# def bite(self,people):# 派生方法 父类没有的方法
# people.life_value -= self.aggressivity
#
# def eat(self):
# Animal.eat(self) #当它加在这里时,可以既执行父类的又执行子类的
# print('吃吃吃')
#
# #人
# class Person(Animal): # 定义一个人类
# def __init__(self, name, aggressivity, life_value, money):
# Animal.__init__(self, name, aggressivity, life_value)
# self.money = money#派生属性
#
# def attack(self,dog):
# dog.life_value -= self.aggressivity
#
# def get_weapon(self,weapon_obj):
# if self.money > weapon_obj.price:
# self.money -= weapon_obj.price # 金老板花钱买武器
# self.weapon = weapon_obj # 金老板装备打狗棒
# self.aggressivity += weapon_obj.aggr # 金老板的攻击力增加了
#
# snoopy =Dog('太白','京巴',250,500)
# # print(snoopy.breed)
# # print(snoopy.name)
# # Animal.eat(snoopy)
#
# snoopy.eat()
# print(snoopy.life_value)
#派生属性:
# 在自己的 init方法里 使用父类的 init方法----指名道姓法
#派生方法: 在子类中增加父类没有的方法
# 父类没有 子类有 : 调用后程序会选 子类的
# 子类没有 父类有 : 调用后选 父类
# 父类有 子类有 : 调用后程序会选 子类 执行

#父类有 子类有: (想调用父类的怎么办)-- Animal.eat(snoopy) 用父类名.方法(子类对象名)
# 父类有 子类有: (两者都想用)调用两次比较麻烦,在子类中指名道姓的调用父类的调用父类的方法(在子类方法中加父类方法的调用)

# 只要想用父类,直接 Animal.eat(snoopy)-- 父类的名字.父类的方法(子类对象)

# 在新式类中
# super() 的应用如下 super 替换Animal 那一行代码可以达到一样的效果
# class Animal:
# def __init__(self,name, aggressivity,life_value):
# self.name = name # 每一只狗都有自己的昵称;
# self.aggressivity = aggressivity # 每一只狗都有自己的攻击力;
# self.life_value = life_value
# def eat(self):
# self.life_value+=10
#
# class Dog(Animal): # 定义一个狗类
# def __init__(self, name, breed, aggressivity, life_value):
# # Animal.__init__(self, name, aggressivity, life_value)
# # super(Dog,self).__init__(name, aggressivity, life_value)
# super().__init__( name,aggressivity, life_value)#新式类 #新方法
#
# self.breed = breed # 每一只狗都有自己的品种;#派生属性 父类没有的方法
#
# def bite(self,people):# 派生方法 父类没有的方法
# people.life_value -= self.aggressivity
#
# def eat(self):
# Animal.eat(self) #当它加在这里时,可以既执行父类的又执行子类的
# print('吃吃吃')
#
# #人
# class Person(Animal): # 定义一个人类
# def __init__(self, name, aggressivity, life_value, money):
# # Animal.__init__(self, name, aggressivity, life_value)
# # super().__init__( name, aggressivity, life_value)
# self.money = money#派生属性
#
# def attack(self,dog):
# dog.life_value -= self.aggressivity
#
# def get_weapon(self,weapon_obj):
# if self.money > weapon_obj.price:
# self.money -= weapon_obj.price # 金老板花钱买武器
# self.weapon = weapon_obj # 金老板装备打狗棒
# self.aggressivity += weapon_obj.aggr # 金老板的攻击力增加了
#
# snoopy =Dog('太白','京巴',250,500)
# # print(snoopy.breed)
# # print(snoopy.name)
# # Animal.eat(snoopy)
#
# snoopy.eat()
# print(snoopy.life_value)
# super(Dog,snoopy).eat() #super 可以再外面发生调用,但是需要传参数# 前面的写法相当于Animal.eat(snoopy)
# print(snoopy.life_value)
#用子类的对象,调用父类的方法
#如果子类中没有这个方法,直接使用父类的方法
#如果子类中有同名方法:
#经典类 指名道姓 类名.方法名(子类对象) 类内外一致
#新式类 super 方法 super(子类名,子类对象).方法名()#类内可以省略self 的参数

# 面试题
# class Foo:
# def __init__(self):
# self.func()
# def func(self):
# print('Foo.func')
# class Son(Foo):
# def func(self):
# print('Son.func') #最后的结果是它,因为初始化的是SON 优先调用自己的func
# s= Son()
# 请问上诉代码打印的是什么结果?

# 钻石继承
#经典类和新式类的多继承问题,继承顺序问题
#
# class D:
# def f(self):
# print('D')
#
# class B(D):
# def f(self):
# print('B')
# class C(D):
# def f(self):
# print('C')
# class A(B,C):pass
# # def f(self):
# # print('A')
#
# a = A()
# a.f()
# 经典类 继承顺序 深度优先 看25天的截图
#新式类 继承顺序 广度优先 看25天的截图

# 新式类中
# A.mro() #新式类中可以查看继承顺序 print(A.mro())

#在好多个有继承关系的类里面,找一个方法,找的顺序问题
#继承三层
#py3---广度优先
# py2--- 经典类 深度优先


# 多态

# python 本身自带多态
posted @ 2017-11-21 19:00  警察学院  阅读(384)  评论(0)    收藏  举报