假期第(25)天

动态混入机制
l 在Python中比较特殊的是,可以动态地为自定义类和
对象增加或删除成员,这一点是和很多面向对象程序
设计语言不同的,也是Python动态类型特点的一种重
要体现
l Python类型的动态性使得我们可以动态为自定义类及
其对象增加新的属性和行为,俗称混入(mixin)机
制,这在大型项目开发中会非常方便和实用
l 例如系统中的所有用户分类非常复杂,不同用户组具
有不同的行为和权限,并且可能会经常改变。这时候
我们可以独立地定义一些行为,然后根据需要来为不
同的用户设置相应的行为能力
动态混入机制26
2
6
动态混入机制示例-1【
04P26.py】
l class Car:
l price = 100000
#定义类属性
l def __init__(self, c):
l self.color = c
#定义实例属性
l car1 = Car("Red")
#实例化对象
l car2 = Car("Blue")
l print(car1.color, Car.price) #查看实例属性和类属性的值
l Car.price = 110000
#修改类属性
l Car.name = 'QQ'
#动态增加类属性
l car1.color = "Yellow"
#修改实例属性
l print(car2.color, car2.price, Car.name)
l print(car1.color, Car.price, Car.name)
l import types
l def setSpeed(self, s):
l self.speed = s
l c
ar
1.
setSpeed = types.MethodType(setSp
ee
d,
ca
r1
)#动态绑定成
l car1.setSpeed(50) #调用成员方法
l print(car1.speed)
动态混入机制
Red 100000
Blue 110000 QQ
Yellow 110000 QQ
502
7
2
7
动态混入机制示例—用户权限示例
04P27.py】
l import types
l class Person(object):
l def __init__(self, name):
l assert isinstance(name, str), 'name must be string'
l self.name = name
l def sing(self):
l print(self.name+' can sing.')
l def walk(self):
l print(self.name+' can walk.')
l def eat(self):
l print(self.name+' can eat.')
l zhang = Person('zhang')
l ##zhang.sing() #用户不具有该行为
l zhang.sing = types.MethodType(sing, zhang) #为用户动态绑定新
行为
l zhang.sing()
l del zhang.sing #删除用户行为
l ##zhang.sing() #用户行为已不具有该行为
动态混入机制
输出结果:
zhang can sing.2
8
28
继承
l 封装、继承、多态是面向对象编程的三大要素
l 继承是用来实现代码复用和设计复用的机制,是面向
对象程序设计的重要特性之一。设计一个新类时,如
果可以继承一个已有的设计良好的类然后进行二次开
发,无疑会大幅度减少开发工作量
l 在继承关系中,已有的、设计好的类称为父类或基类,
新设计的类称为子类或派生类。派生类可以继承父类
的公有成员,但是不能继承其私有成员。如果需
派生类中调
用基类
的方法
可以使用内置函数
su
p
er
()
或者通过"基类名
.方法名
()
"的方式来实现这一目
l P
y
tho
n支持多继承,如果父类中
中使用时没有指定父类
Py
th
on
解释
从左向右按顺序进行搜索
l 案例分析:设计Person类,并根据Person类派生
Teacher类,分别创建Person类与Teacher类的对象进
行测试【
04P28.py】
继承与多态29
2
9
多态
l 所谓多态(
polymorphism),是指基类的同一个方法
在不同派生类对象中具有不同的表现和行为。派生类
继承了基类行为和属性之后,还会增加某些特定的行
为和属性,同时还可能会对继承来的某些行为进行一
定的改变,这都是多态的表现形式
l Python大多数运算符可以作用于多种不同类型的操作
数,并且对于不同类型的操作数往往有不同的表现,
这种多态是通过特殊方法与运算符重载实现的
继承与多态3
0
30
多态示例【
04P30.py】
l class Animal(object): #定义基类
l def show(self):
l print('I am an animal.')
l class Cat(Animal): #派生类,覆盖了基类的show()方法
l def show(self):
l print('I am a cat.')
l class Dog(Animal): #派生类
l def show(self):
l print('I am a dog.')
l class Tiger(Animal): #派生类
l def show(self):
l print('I am a tiger.')
l class Test(Animal): #派生类,没有覆盖基类的show()方法
l pass
l x = [item() for item in (Animal, Cat, Dog, Tiger, Test)]
l for item in x: #遍历基类和派生类对象并调用show()方法
l item.show()
posted @ 2022-01-25 17:29  我的未来姓栗山  阅读(30)  评论(0编辑  收藏  举报