抽象类
抽象类是包含抽象方法的类,而按象方法不包含任何可实现的代码,只能在其子类中实现抽象函数的代码。
动物类 ==》体重、名字 >>>发出声音
猫类、狗类、猪类、牛类
class Animoal():
def __init__(self,name,weight):
self.name = name
self.weight = weight
def say(self):
print('汪汪')#不能强制写死,动物是不能发出具体声音的
class Cat(Animoal):
def __init__(self,name,weight):
super().__init__(name,weight)
class Dog(Animoal):
def __init__(self, name, weight):
super().__init__(name,weight)
cat_a = Cat('猫',12)
cat_a.say()
#需要对类提取一次公共属性和方法 ==》抽象类
改装之后代码如下:
方法1:在父类中强制实现,但在子类中需要实现父类的抽象方法,或把子类也声明抽象方法
from abc import ABCMeta,abstractmethod
class Animoal(metaclass=ABCMeta):#方法一:class Animoal(metaclass=ABCMeta):强制性
#__metaclass__=ABCMeta #方法二:抽象类首行需要加入
def __init__(self,name,weight):
self.name = name
self.weight = weight
@abstractmethod #定义抽象方法需要加入abstractmethod
def say(self):
pass#不能强制写死,动物是不能发出具体声音的
class Cat(Animoal):#父类是抽象类的时候:1、实现父类的抽象方法;2、把子类也声明为抽象类
def __init__(self,name,weight):
super().__init__(name,weight)
def say(self): #1、实现父类的抽象方法
print('喵~')
class Dog(Animoal):
def __init__(self, name, weight):
super().__init__(name,weight)
@abstractmethod #2、把子类也声明为抽象类
def say(self):
print('汪~')
cat_a = Cat('猫',12)
cat_a.say()
#需要对类提取一次公共属性和方法 ==》抽象类
实例:
人类 —老师、学生
学生选课、老师授课
每个老师 == N个学生
每个学生 ==只能选择一个老师
学生:选择哪些课程等。
from abc import ABCMeta,abstractmethod
class People(metaclass=ABCMeta):
def __init__(self,name,sex):
self.name = name
self.sex = sex
@abstractmethod
def goto_class(self):
pass
class Stu(People):
def __init__(self,name,sex,check_cource,check_teacher):
super().__init__(name,sex)
self.check_cource=check_cource
self.check_teacher = check_teacher
def goto_class(self):
print('%s去教室听课'%self.name)
class teacher(People):
def __init__(self,name,sex,stu_name):
super(teacher, self).__init__(name,sex)
self.stu_name=stu_name
def goto_class(self):
print('%s去教室授课'%self.name)
xiaoming = Stu('小明','男','语文','李老师')
xiaoming.goto_class()
多态:
多态指的是一类事物具有多种形态,只有存在父子类关系才会让一类事物具有多种不同的形态,因而多态的前提是必须要实现继承。在多态的实现过程中,经常会使用抽象类。
多态性:多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
列如:序列类型有多种形态:字符串、列表、元组
实例:
import abc
class File(metaclass=abc.ABCMeta):
@abc.abstractmethod
def double_click(self):
pass
class TxtFile(File):
def double_click(self):
print('open file')
class ExeFile(File):
def double_click(self):
print('执行exe')
class VideoFile(File):
def double_click(self):
print('播放VideoFile')
def double_click(file_object): #多态性
file_object.double_click()
txt_file = TxtFile()
exe_file = ExeFile()
double_click(txt_file)
double_click(exe_file)