多态是OOP的三大特征之一
字面意思:多种形态 多种状态
一个事物具备多种形态
例如: 水 具备水蒸气 冰
赛博坦星人: 汽车人 飞机人 汽车
动物:人 猿猴 猫 吃 叫 睡
官方描述: 不同对象可以响应(调用)同一个方法 产生不同的结果
多态不是什么新技术 我们在编写面向对象的程序时 其实就有多态存在
import abc
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def eat(self):
pass
@abc.abstractmethod
def bark(self):
pass
@abc.abstractmethod
def sleep(self):
pass
class Person(Animal):
def eat(self):
print("人用筷子吃")
def bark(self):
print("hello")
def sleep(self):
print("躺着睡")
class Cat(Animal):
def eat(self):
print("猫用爪子吃")
def bark(self):
print("喵喵叫")
def sleep(self):
print("蜷这睡")
obj = Person()
obj1 = Cat()
# 不同对象可以响应相同的方法 产不同的结果
# obj.eat()
# obj1.eat()
# 对于对象的使用者而言 无需关心对象的具体实现 甚至不用关心具体类型
# 极大的降低了使用难度
def animal_admin(animal):
animal.eat()
animal.bark()
animal.sleep()
animal_admin(obj)
animal_admin(obj1)
def MY_LEN(c):
print(c.__len__())
l1 = [1,2,3]
text = "abc"
MY_LEN(l1)
MY_LEN(text)
print(len(l1))
print(len(text))
鸭子类型:
鸭子类型
python不会强行限制 必须干什么 或不干什么
就比如封装中的私有属性 你也是可以强行访问的
同理 在多态中 子类中你可以不使用ABC模块
python崇尚鸭子类型
如果一个对象 长得像鸭子 叫声像鸭子 走路像鸭子 那么他就是鸭子
class Cat:
def eat(self):
print("猫吃鱼")
def sleep(self):
print("猫睡觉")
class Dog:
def eat(self):
print("狗吃肉")
def sleep(self):
print("狗睡觉")
dog1 = Dog()
cat1 = Cat()
dog1.eat()
cat1.eat()
def animal_admin(animal):
animal.eat()
animal.sleep()
animal_admin(dog1)
animal_admin(cat1)
isinstance和issubclass:
# 判断一个对象是否是一个类的实例
a = 100
print(type(a) == int)
print(isinstance(10,int))
print(isinstance("abc",int))
print(isinstance("abc",object))
class A:
pass
class B(A):
pass
# 参数1 是子类 参数2 是父类
print(issubclass(B,A))
# __str__ 可以用于定制对象的打印格式
# 会在print对象时自动触发执行
class Person:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
def show_info(self):
print("my name is %s age %s sex %s" %
(self.name,self.age,self.sex))
# 打印对象时自动触发
def __str__(self):
print("run")
return ("my name is %s age %s sex %s" %
(self.name,self.age,self.sex))
p1 = Person("xxx","man",20)
# p1.show_info()
print(p1)
# print(Person)
# __del__
# 对象从内存中删除时自动触发执行
# 1.程序运行完毕时
# 2.手动调用del
# 作用:用于做一些清理操作 比如开启了文件资源 就需要手动关闭
# 使用场景: 当你的对象在创建时同时开启了不属于解释器的资源
# 就需要在del中来回收资源
# 也称之为析构函数 构造
class MYRead:
def __init__(self,filepath,mode,encode):
self.filepath = filepath
self.mode = mode
self.encode = encode
self.file = open(filepath,mode,encoding=encode)
def read_data(self):
return self.file.read()
def __del__(self):
self.file.close()
print("文件已经关闭")
r = MYRead("今日内容","rt","utf-8")
print(r.read_data())