一、多态练习
主人Master:请好友吃饭,陪好友玩 好友Friend: 中国朋友:吃饺子,表演太极拳 美国朋友:吃披萨,踢足球
class Friend:
def eat(self):
pass
def play(self):
pass
class Chinese(Friend):
def eat(self):
print("吃饺子")
def play(self):
print("表演太极拳")
class American(Friend):
def eat(self):
print("吃披萨")
def play(self):
print("踢足球")
class Master:
def treat(self, friend):
friend.play()
二、静态方法
设计实现单例设计模式(代码实现)
1.静态方法和类方法区别? 静态方法:无默认参数; 类方法:至少一个cls参数;执行类方法时,自动将调用该方法的类赋值给cls; 2.如果方法内部 即需要访问 实例属性,又需要访问 类属性,应该定义成什么方法? 实例方法
def singleton(cls):
__instance = {}
def wrapper(x):
if cls in __instance:
return __instance[cls]
else:
__instance[cls] = cls(x)
return __instance[cls]
return wrapper
@singleton # 相当于A = singleton(A)
class A(object):
def __init__(self, x=0):
self.x = x
a1 = A(1)
a2 = A(2)
print(id(a1))
print(id(a2))
1.随着python解释器的执行,我们遇到的是一个@singleton,这时候就开始对代码进行了一个装饰,也就是执行了A = singleton(A) 2.调用了singleton()并将类的引用传递进去,此时我们的cls就指向了A,然后执行内部代码,代码内部有定义了一个空字典和一个函数, 并且返回了这个函数的引用,此时我们的A就指向了wrapper, 3.A = singleton(A)执行结束 4.a1 = A(1),由于A指向了wrapper此时的A(1)相当于wrapper(1) 5.调用wrapper(1),执行内部的代码,判断cls是否在字典中,此时字典为空会执行else中的代码 6.__instance[cls] = cls(x) 此时cls指向了A,x=1, cls(x)相当于A(1)即创建了一个实例对象,我们将这个实例对象存入字典中, 键为cls,最后返回__instance[cls],也就是从字典中取出了这个实例对象,然后返回。 7.a1接收了这个返回值,此时a1也就指向了这个实例对象。 8.执行结束 9.当执行a2 = A(2),在判断语句中,字典中已经存在了cls的键,因此执行if后的代码,直接返回了之前创建的实例对象,此时a2也指向了这个实例对象。 10.上述过程也就完成了类装饰器实现单例设计模式。
三、乐器
编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从而发出不同的声音。可以弹奏的乐器包括二胡、钢琴和琵琶。 实现思路及关键代码: 1)定义乐器类Instrument,包括makeSound()方法,此方法中乐器声音:"乐器发出美妙的声音!" 2)定义乐器类的子类:二胡Erhu、钢琴Piano和小提琴Violin 二胡Erhu声音:"二胡拉响人生" 钢琴Piano声音:"钢琴美妙无比" 小提琴Violin声音:"小提琴来啦" 3)用main类,多态的方式对不同乐器进行切换
class Instrument():
def makeSound(self):
print('乐器发出美妙的声音!')
class Erhu(Instrument):
def makeSound(self):
print('二胡拉响人生')
class Piano(Instrument):
def makeSound(self):
print('钢琴美妙无比')
class Violin(Instrument):
def makeSound(self):
print('小提琴来啦')
class Main():
def play(self, obj):
# print('请问你要弹奏什么乐器?')
obj.makeSound()
main = Main()
v = Violin()
p = Piano()
erhu = Erhu()
main.play(v)