• 8.05_python_lx_day24


    一.多态:

    • 不同的子类对象,调用相同的父类方法,产生不同的执行结果
    • 关键字: 继承 , 改写

    (1)示例

    class Soldier():
        def attack(self):
            pass
        
        def back(self):
            pass
    
    # 陆军
    class Army(Soldier):
        def attack(self):
            print("[陆军]搏击,ufc,无限制格斗,太极,八卦,占星,制作八卦符")
        
        def back(self):
            print("[陆军]白天晨跑10公里,也行800百公里")
    
    # 海军
    class Navy(Soldier):
        def attack(self):
            print("[海军]潜泳水下30个小时,手捧鱼雷,亲自送到敌人的老挝,炸掉敌人的碉堡")
        
        def back(self):
            print("[海军]每小时在海底夜行800公里,游的比鲨鱼还快")
    
    # 空军
    class AirForce(Soldier):
        def sttack(self):
            print("[空军]空中夺导弹,手撕飞机,在空中打飞机,精准弹幕")
        
        def back(self):
            print("[空军]高中跳伞,落地成盒")

    (2)实例化对象

    <1>实例化陆军对象

    army_obj = Army()

    <2>实例化海军对象

    navy_obj = Navy()

    <3>实例化空军对象

    af_obj = AirForce()

    (3)调用

    lst = [army_obj,navy_obj,af_obj]    
    strvar = '''
    1.所有兵种开始攻击训练
    2.所有兵种开始撤退训练
    3.空军练习攻击,其他兵种练习撤退
    '''
    print(strvar)
    num = input('将军请下令,选择训练的种类')
    for i in lst:
        if num == '1':
            i.attack()
        elif num == '2':
            i.back()
        elif num == '3':
            if isinstance(i,AirForce):
                i.attack()
            else:
                i.back()
        else:
            print('将军~,风太大,我听不见~')
            break

    二. __new__魔术方法

    • 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前)
    • 功能:控制对象的创建过程
    • 参数:至少一个cls接受当前的类,其他根据情况决定
    • 返回值: 通常返回对象或None

    (1)基本语法

    class MyClass2():
        pty = 100
    obj2 = MyClass2()
    
    class MyClass():
        def __new__(cls):
            print(cls)
            #类.方法(自定 义类) => 借助父类object创建MyClass这个类的对象
            obj = object.__new__(cls)
            # (1) 借助父类object创建自己类的一个对象
            return obj
            # (2) 返回其他类的对象
            return obj2  # print(obj.pty) =>obj2.pty = 100
            # (3) 不能返回任何对象
            return None
    
    obj = MyClass()
    print(obj)

    (2) __new__ 触发时机快于构造方法

    • __new__ 用来创建对象
    • __init__ 用来初始化对象
    • 先创建对象,才能在初始化对象,所以__new__快于__init__
    1 class Boat():
    2     def __new__(cls):
    3         print(2)
    4         return object.__new__(cls)
    5     def __init__(self):
    6         print(1)
    7 
    8 obj = Boat()

    (3) __new__ 和 __init__ 参数一一对应

    <1>单个参数的情况

    1 class Boat():
    2     def __new__(cls,name):
    3         return object.__new__(cls)
    4     def __init__(self,name):
    5         self.name = name
    6 
    7 obj = Boat('友谊小船说裂开就裂开')
    8 print(obj.name)

    <2>多个参数的情况

    class Boat():
        def __new__(cls,*args,**kwargs):
            return object.__new__(cls)
            
        def __init__(self,name,color,shangpai):
            self.name = name
            self.color = color
            self.shangpai = shangpai
            
    obj = Boat("泰坦尼克号","屎绿色","京A66688")
    print(obj.name)
    print(obj.color)
    print(obj.shangpai)

    (4) 注意点

    • 如果返回的对象不是自己本类中的对象,不会触发本类的构造方法
    class MyClass():
        pty = 200
    obj = MyClass()
    
    class Boat():
        def __new__(cls,*args,**kwargs):
            # return object.__new__(cls)
            # return obj
            return None
        def __init__(self):
            print("构造方法被触发")
    obj = Boat()
    print(obj)

    三.单态模式

    • 一个类,无论实例化多少个对象,都有且只有一个
    • 优点:节省内存空间,提升执行效率
    • 针对于不要额外对该对象添加成员的场景(比如:mysql的增删改查)

    (1) 基本语法

     1 class SingleTon():
     2     __obj = None
     3     def __new__(cls):
     4         if cls.__obj is None:
     5             # 把创建出来的对象赋值给私有成员__obj
     6             cls.__obj = object.__new__(cls)
     7         return cls.__obj    
     8 obj1 = SingleTon()
     9 obj2 = SingleTon()
    10 obj3 = SingleTon()
    11 print(obj1,obj2,obj3)

    代码解析

    • 第一次实例化对象时候, 创建一个对象赋值给cls.__obj,返回 cls.__obj
    • 第二次实例化对象时候, 判定cls.__obj is None: 不成立, 直接返回上一次创建好的那一个对象
    • 第三次实例化对象时候, 判定cls.__obj is None: 不成立, 直接返回上一次创建好的那一个对象

    (2) 单态模式 + 构造方式

    class SingleTon():
        __obj = None
        def __new__(cls,*args,**kwargs):
            if cls.__obj is None:
                cls.__obj = object.__new__(cls)
            return cls.__obj
            
        def __init__(self,name):
            self.name = name
            
    obj1 = SingleTon('abc')
    obj2 = SingleTon('123')
    print(obj1.name)#123
    print(obj2.name)#123

    代码解析

    • obj1 = SingleTon(abc) self.name = abc
    • obj2 = SingleTon(123) self.name = "123"
    • self 代表的是本对象
    • 第一次实例化对象时候,创建一个对象,赋值name为abc
    • 第二次实例化对象时候,因为 cls.__obj is None不满足,返回上一个创建好的对象
    • 为上一个对象的name这个属性赋值为123
    • obj1 和 obj2 所指代的对象是同一个对象
    • obj1.name => 123
    • obj2.name => 123
  • 相关阅读:
    EF6(CodeFirst)+MySql开发遇到的坑
    Entity Framework mvc Code First data migration
    SQL 修改排序规则的问题 sql_latin1_general_cp1_ci_as
    sql 与linq的转换
    Entity Framework的事务提交
    .net Quartz 服务 作业调度
    如何插上U盘 自动复制内容
    SQL学习之--触发器
    原生javascript与jquery 的比较
    原生javascript学习
  • 原文地址:https://www.cnblogs.com/Magicianlx/p/13443103.html
Copyright © 2020-2023  润新知