- 面向对象三大特性
- 1. 封装
- 2. 继承
- 3.多态
- 4.补充
- 综合案例
就是把文件封起来
好处:
1. 用起来更方便
2. 可以保证数据的安全
3. 利于代码维护
2. 继承
继承一些父类的非私有属性和方法,继承是使用,不是复制
分类:
单继承
仅仅继承了一个父类
多继承
继承了多个父类
继承下的影响
-
资源的继承
明确继承是指资源的使用权
出来私有属性和方法,其他都能继承
-
资源的使用
-
继承的几种形态 及该遵循的标准原则
-
单继承链 从自己身上开始往上找
-
无重叠的多继承链 按一条单继承链先自下往上找 类似于深度查找
-
有重叠的多继承链 类似于宽度查找
-
-
针对几种标准原则的方案演化
-
Python2.2之前 仅仅存在经典类 MRO原则:深度优先(从左往右) 问题:“有重叠的多继承”中,违背“重写可用原则”
-
Python2.2 产生了新式类
MRO原则:经典类:深度优先(从左往右)
新式类:深度优先(从左到右)的算法基础上优化了:如果产生重复元素,会保留最后一个,并且,更尊重基类出现的先后顺序
但不是广度优先算法
问题:无法检测出有问题的继承
有可能还会违背“局部优先”的原则
-
Python2.3-2.7 新式类经典类并存
MRO原则:经典类:深度优先(从左到右)
新式类:C3算法
C3算法步骤:
-
Python3.x之后 都是新式类:C3算法
-
-
-
资源的覆盖
-
资源的累加
多态:
- 一个类,所延伸的多种形态
- 调用时的多种形态
多态在Python中的体现:
鸭子类型:动态类型的一种风格
只在乎对象的“行为和属性”,不在不对象的类型
4.补充抽象类:一个抽象出来的类,并不是某一个具化的类
不能直接创建实例的类 创建会报错
抽象方法:一个抽象出来的方法
不能具体实现 不能之际调用,子类不实现回报错
Python中的实现:无法直接支持,需要借助一个模块 import abc
设置元类为 abc.ABCMeta
使用装饰器修饰抽象方法@abc.abstractmethod
import abc
class Animal(object, metaclass=abc.ABCMeta):
@abc.abstractmethod
def jiao(self):
pass
@abc.abstractclassmethod
def test(cls):
pass
class Dog(Animal):
def jiao(self):
print("汪汪汪")
@classmethod
def test(cls):
print("xxx")
pass
pass
class Cat(Animal):
def jiao(self):
print("喵喵喵")
@classmethod
def test(cls):
print("xxx")
pass
def test(obj):
obj.jiao()
# Animal()
d = Dog()
d.jiao()
c = Cat()
test(d)
综合案例
# 定义三个类,小狗,小猫,人
# 小狗:姓名,年龄(默认1岁): 吃饭,玩,睡觉,看家(格式:名字是xxx,年龄xx岁的小狗在xx)
# 小猫:姓名,年龄(默认1岁): 吃饭,玩,睡觉,捉老鼠(格式:名字是xxx,年龄xx岁的小猫在xx)
# 人:姓名,年龄(默认1岁),宠物: 吃饭,玩,睡觉,看家(格式:名字是xxx,年龄xx岁的人在xx)
# 养宠物(让所有的宠物吃饭,玩,睡觉)
# 让宠物工作(让所有的宠物根据自己的职责开始工作)
class Animal:
def __init__(self, name, age=1):
self.name = name
self.age = age
def eat(self):
print("%s在吃饭"%self)
def play(self):
print("%s在玩"%self)
def sleep(self):
print("%s在睡觉"%self)
class Person(Animal):
def __init__(self, name, pets, age=1):
super(Person, self).__init__(name, age)
self.pets = pets
def yangPets(self):
for pet in self.pets:
pet.eat()
pet.play()
pet.sleep()
def make_pets_work(self):
for pet in self.pets:
pet.work()
# if isinstance(pet, Dog):
# pet.watch()
# elif isinstance(pet, Cat):
# pet.catch()
def __str__(self):
return "名字是{},年龄{}岁的人".format(self.name,self.age)
class Cat(Animal):
# 在创建一个小狗实例的时候,给它设置几个属性
def __init__(self, name, age=1):
self.name = name
self.age = age
def work(self):
print("%s在捉老鼠"%self)
def __str__(self):
return "名字是{},年龄{}岁的小猫".format(self.name,self.age)
class Dog(Animal):
# 在创建一个小狗实例的时候,给它设置几个属性
def __init__(self, name, age=1):
self.name = name
self.age = age
def work(self):
print("%s在看家"%self)
def __str__(self):
return "名字是{},年龄{}岁的小狗".format(self.name,self.age)
d = Dog("小黑", 18)
c = Cat("小红", 2)
p = Person("sz", [d, c], 18)
p.yangPets()
p.make_pets_work()
# class Person:
# # 在创建一个小狗实例的时候,给它设置几个属性
# def __init__(self, name, pets, age=1):
# self.name = name
# self.age = age
# self.pets = pets
# def eat(self):
# print("%s在吃饭"%self)
#
# def play(self):
# print("%s在玩"%self)
# def sleep(self):
# print("%s在睡觉"%self)
# def yangPets(self):
# for pet in self.pets:
# pet.eat()
# pet.play()
# pet.sleep()
# def make_pets_work(self):
# for pet in self.pets:
# pet.work()
# # if isinstance(pet, Dog):
# # pet.watch()
# # elif isinstance(pet, Cat):
# # pet.catch()
# def __str__(self):
# return "名字是{},年龄{}岁的人".format(self.name,self.age)
#
# class Cat:
# # 在创建一个小狗实例的时候,给它设置几个属性
# def __init__(self, name, age=1):
# self.name = name
# self.age = age
# def eat(self):
# print("%s在吃饭"%self)
#
# def play(self):
# print("%s在玩"%self)
#
# def sleep(self):
# print("%s在睡觉"%self)
#
# def work(self):
# print("%s在捉老鼠"%self)
# def __str__(self):
# return "名字是{},年龄{}岁的小猫".format(self.name,self.age)
#
# class Dog:
# # 在创建一个小狗实例的时候,给它设置几个属性
# def __init__(self, name, age=1):
# self.name = name
# self.age = age
# def eat(self):
# print("%s在吃饭"%self)
#
# def play(self):
# print("%s在玩"%self)
#
# def sleep(self):
# print("%s在睡觉"%self)
#
# def work(self):
# print("%s在看家"%self)
# def __str__(self):
# return "名字是{},年龄{}岁的小狗".format(self.name,self.age)
#
# d = Dog("小黑", 18)
# c = Cat("小红", 2)
# p = Person("sz", [d, c], 18)
# p.yangPets()
#
# p.make_pets_work()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)