P128 多态问题的引出
- 先看一个问题
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/728e8102eeba4ab5a276bb194ec6953f.png)
class Food:
name = None
def __init__(self,name):
self.name = name
class Fish(Food):
pass
class Bone(Food):
pass
class Animal:
name = None
def __init__(self,name):
self.name = name
class Dog(Animal):
pass
class Cat(Animal):
pass
class Master:
name = None
def __init__(self, name):
self.name = name
def feed__cat(self,cat :Cat,fish :Fish):
print(f"主人{self.name},给动物:{cat.name},喂的食物是{fish.name}")
def feed__dog(self,dog :Dog,bone :Bone):
print(f"主人{self.name},给动物:{dog.name},喂的食物是{bone.name}")
master = Master("zoran")
cat = Cat("小花猫")
fish = Fish("黄花鱼")
dog = Dog("大黄狗")
bone = Bone("大棒骨")
master.feed__cat(cat,fish)
master.feed__dog(dog,bone)
1)问题是:代码的复用性不高,而且不利于代码维护和功能扩展
2)解决方案:引出我们要讲解的多态
P129 多态细节和使用
1. 多态介绍&特别说明
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/fcce029ce14b4745994dbe813e192522.png)
class Animal:
def cry(self):
pass
class Dog(Animal):
pass
class Cat(Animal):
def cry(self):
print("小猫喵喵叫...")
class Dog(Animal):
def cry(self):
print("小狗汪汪叫...")
class Pig(Animal):
def cry(self):
print("小猪噜噜叫...")
def func(animal: Animal):
animal.cry()
cat = Cat()
dog = Dog()
pig = Pig()
func(cat)
func(dog)
func(pig)
2. 多态的好处
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/8d463fb1dfd2459fa59ef36d5f4379f2.png)
3. 特别说明: Python多态的特点
1)Python中函数/方法的参数是没有类型限制的,所以多态在python中的体现并不是很严谨(比如:和java等强类型语言比)
2)Python并不要求严格的继承体系,关注的不是对象的类型本身,而是它是否具有要调用的方法(行为)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2975038b94ac4867b707299807936ab2.png)
class AA:
def hi(self):
print("AA-hi()..")
class BB:
def hi(self):
print("BB-hi()...")
def test(obj):
obj.hi()
aa = AA()
bb = BB()
test(aa)
test(bb)
4. 使用多态的机制来解决主人喂食物的问题
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b852bd23a564412ea29d854b029b8902.png)
class Food:
name = None
def __init__(self, name):
self.name = name
class Fish(Food):
pass
class Bone(Food):
pass
class Grass(Food):
pass
class Animal:
name = None
def __init__(self, name):
self.name = name
class Dog(Animal):
pass
class Cat(Animal):
pass
class Horse(Animal):
pass
class Master:
name = None
def __init__(self, name):
self.name = name
def feed(self, animal: Animal, food: Food):
print(f"主人{self.name},给动物:{animal.name},喂的食物是{food.name}")
master = Master("Zoran")
cat = Cat("小花猫")
fish = Fish("黄花鱼")
dog = Dog("大黄狗")
bone = Bone("大棒骨")
horse = Horse("乌骓马")
grass = Grass("新鲜草")
master.feed(cat, fish)
master.feed(dog, bone)
master.feed(horse, grass)
P130 isinstance函数
- 基本说明
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/368528a614f5485d9889ac26a3bf744b.png)
class AA:
pass
class BB(AA):
pass
class CC:
pass
aa = AA()
bb = BB()
cc = CC()
print(f"obj是不是BB的对象{isinstance(bb, BB)}")
print(f"obj是不是AA的对象{isinstance(bb, AA)}")
print(f"obj是不是CC的对象{isinstance(bb, CC)}")
num = 9
print(f"num 是不是int: {isinstance(num, int)}")
print(f"num 是不是str: {isinstance(num, str)}")
print(f"num 是不是str/int/list: {isinstance(num, (int,str,list))}")
class A:
i = 10
def sum(self):
return self.getI() + 10
def sum1(self):
return self.i + 10
def getI(self):
return self.i
class B(A):
i = 20
def getI(self):
return self.i
b = B()
print(b.sum())
print(b.sum1())
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/33803558cf614126bcbca481ccc2ef12.png)
class Employee:
__name = None
__salary = None
def __init__(self, name, salary):
self.__name = name
self.__salary = salary
def get_annual(self):
return self.__salary * 12
def set_name(self, name):
self.__name = name
def get_name(self):
return self.__name
def set_salary(self, salary):
self.__salary = salary
def get_salary(self):
return self.__salary
class Manager(Employee):
__bonus = None
def __init__(self, name, salary, bonus):
super().__init__(name, salary)
self.__bonus = bonus
def set_bonus(self, bonus):
self.__bonus = bonus
def get_bonus(self):
return self.__bonus
def manage(self):
print(f"经理:{self.get_name()}正在工作中...")
def get_annual(self):
return super().get_annual() + self.__bonus
class Worker(Employee):
def work(self):
print(f"普通工人:{self.get_name()}正在工作中...")
def show_emp_annual(e: Employee):
print(f"{e.get_name()},年工资是: {e.get_annual()}")
def working(e: Employee):
if isinstance(e, Worker):
e.work()
elif isinstance(e, Manager):
e.manage()
else:
print("无法确定工作状态")
worker = Worker("king", 10000)
show_emp_annual(worker)
manager = Manager("tim", 20000, 100000)
show_emp_annual(manager)
working(worker)
working(manager)