寒假自学(七)

希望所有温柔又可爱的人最后都能幸福❤

今日总结:

代码量 200行
博客量 一篇
所学时间 4小时左右
了解到的知识点 python面向对象多态、单例设计模式

明日计划:

早上 python模块
下午 python抛出异常
晚上

具体内容:

多态

多态不同的子类对象调用的父类方法,产生不同的执行结果

  • 多态可以增加代码的灵活度
  • 继承重写父类方法为前提
  • 是调用方法的技巧,不会影响到类的内部设计
class Dog(object):
    def __init__(self, name):
        self.name = name

    def game(self):
        print("%s 蹦蹦跳跳的玩耍..." % self.name)


class XiaoSongYue(Dog):
    def game(self):
        print("%s 飞到天上去玩耍..." % self.name)


class Person(object):
    def __init__(self, name):
        self.name = name

    def game_with_Dog(self, dog):
        print("%s 和 %s 快乐的玩耍..." % (self.name, dog.name))

        dog.game()


# xsy = Dog("肖松月")
xsy = XiaoSongYue("肖松月")
pyf = Person("蒲煜凡")

pyf.game_with_Dog(xsy)

实例

在初始化方法中定义对象属性,创建对象后,内存中就有了一个对象的实实在在的存在--实例

  • 在程序运行时,同样会被加载到内存
  • python中,是一个特殊的对象--类对象
  • 在程序运行时,类对象在内存中只有一份,使用一个类可以创建出很多个对象实例
  • 除了封装实例属性方法外,类对象还可以拥有自己的属性方法

类属性和实例属性

  • 类属性就是给类对象中定义的属性
  • 通常用来记录与这个类相关的特征
  • 类属性不会用于记录具体对象的特征
class Tool(object):
    # 类属性
    count = 0

    def __init__(self, name):
        self.name = name
        Tool.count += 1


tool1 = Tool("斧头")
tool2 = Tool("榔头")
too3 = Tool("水桶")
print(Tool.count)

属性获取机制

python属性的获取存在一个向上查找机制

  • 用过类名.类属性获取类属性

  • 不推荐采用对象.类属性

print("工具对象总数是 %d" %tool3.count)

类方法

  • 类方法内部可以直接访问类属性或者调用其他的类方法

在方法内部通过cls.来访问类的属性或调用其他的类方法

class Tool(object):
    count = 0

    @classmethod
    def show_tool_count(cls):
        print("工具对象的数量 %d" % cls.count)

    def __init__(self, name):
        self.name = name
        Tool.count += 1


tool1 = Tool("斧头")
tool2 = Tool("榔头")
Tool.show_tool_count()

静态方法

既不需要访问实例属性或者调用实例方法也不需要访问类属性或者调用类方法时可以使用静态方法

class Dog(object):
    @staticmethod
    def run():
        print("小狗要跑...")

综合演练:

class Game(object):
    # 历史最高分
    top_score = 0

    def __init__(self, player_name):
        self.player_name = player_name

    @staticmethod
    def show_help():
        print("帮助信息:让僵尸进入大门")

    @classmethod
    def show_top_score(cls):
        print("历史记录 %d" % cls.top_score)

    def start_game(self):
        print("%s 开始游戏啦..." % self.player_name)


Game.show_help()
Game.show_top_score()
xsy = Game("肖松月")
xsy.start_game()

单列设计模式

  • 目的--让创建的对象,在系统中只有唯一的一个实例

  • 每一次执行类名()返回的对象,内存地址是相同的

  • 使用类名()创建对象时,python的解释器首先会调用__new__方法为对象分配空间

重写__new__方法一定要return super().__new__(cls)

class MusicPlayer(object):
    # *args:多值元组参数
    # ** kwargs:多值字典参数
    def __new__(cls, *args, **kwargs):
        # 创建对象时,new方法会被自动调用
        print("创建对象,分配空间")
        # 调用父类方法
        return super().__new__(cls)

    def __init__(self):
        print("播放器初始化")


player = MusicPlayer()

print(player)

希望让初始化动作只被执行一次

class MusicPlayer(object):
    instance = None
    init_flag = False

    # *args:多值元组参数
    # ** kwargs:多值字典参数
    def __new__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = super().__new__(cls)
        return cls.instance

    def __init__(self):
        if not MusicPlayer.init_flag:
            print("初始化播放器")
            MusicPlayer.init_flag = True


player1 = MusicPlayer()
print(player1)

player2 = MusicPlayer()
print(player2)
posted @ 2021-01-09 23:22  DemonSlayer  阅读(70)  评论(0编辑  收藏  举报