zoukankan      html  css  js  c++  java
  • 寒假自学(七)

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

    今日总结:

    代码量 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)
    
  • 相关阅读:
    测试开发知识体系
    渗透测试全套教程(从原理到实战)
    解决edittext输入多行可以滑动的问题
    SharedPreferences实现自动登录记住用户名密码
    listview当选中某一个item时设置背景色其他的不变
    转 -android:程序无响应,你该如何定位问题?
    区分listview的item和Button的点击事件
    转--2014年最新810多套android源码2.46GB免费一次性打包下载
    转-android 支付宝SDK集成
    转-封装网络请求库,统一处理通用异常 (基于volley网络请求库)
  • 原文地址:https://www.cnblogs.com/125418a/p/14280149.html
Copyright © 2011-2022 走看看