Python的‘态’

一、多态练习

主人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)

猜你喜欢

转载自blog.csdn.net/Sjm05/article/details/127446175