python面向对象之多态, 单态
多态
不同的子类对象调用相同的父类方法,得到不同的执行结果
"继承 重写"
class Soldier(): def attack(self): pass def back(self): pass # 陆军 class Army(Soldier): def attack(self): print("[陆军]开坦克装甲部队,开大炮轰炸敌方根据地,拼刺刀,手撕鬼子") def back(self): print("[陆军]为了一条性命,夜行八百,日行一千,回家") # 海军 class Navy(Soldier): def attack(self): print("[海军]开航空母舰,扔鱼叉,撒网捆住敌人,收网") def back(self): print("[海军]直接跳水,下海喂鱼,原地爆炸") # 空军 class AirForce(Soldier): def attack(self): print("[空军]空对地投放原子弹,空对空发射巡航导弹") def back(self): print("[空军]直接跳机,落地成盒") # 创建士兵 obj1 = Army() obj2 = Navy() obj3 = AirForce() # lst = [obj1,obj2,obj3] # lst = [Army(),Navy(),AirForce()] strvar = """ 将军请下令: 1.全体出击 2.全体撤退 3.海军上,其他兵种撤退 """ num = input(strvar) for i in lst: # print(i) if num == "1": i.attack() elif num == "2": i.back() elif num == "3": if isinstance(i,Navy): i.attack() else: i.back() else: print("风太大,小弟听不见") break
单态模式(同一个类,无论实例化多少次,都有且只有一个对象)
每创建一个对象,就会在内存中多占用一份空间
为了节省空间,提升执行效率,使用单态模式
场景:只是单纯调用类中的成员,而不会额外为当前对象添加成员;
class Singleton(): __obj = None def __new__(cls): if cls.__obj is None: cls.__obj = object.__new__(cls) return cls.__obj """ 第一次,在实例化对象时触发__new__魔术方法 if cls.__obj is None 条件成立 cls.__obj = object.__new__(cls) 创建一个对象给私有成员属性__obj return cls.__obj 用obj1接收到了对象 第二次,在实例化对象时触发__new__魔术方法 if cls.__obj is None不满足,因为已经在__obj属性中存放了一个对象 return cls.__obj 第三次,在实例化对象时触发__new__魔术方法 if cls.__obj is None不满足,因为已经在__obj属性中存放了一个对象 return cls.__obj """ obj1 = Singleton() obj2 = Singleton() obj3 = Singleton() print(obj1,obj2,obj3) # 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("康玉康") obj2 = Singleton("张保张") print(obj1,obj2) print(obj1.name) print(obj2.name) """ 康玉康 康玉康 康玉康 张保张 张保张 张保张 第一次实例化对象时, 触发__new__ if cls.__obj is None: 创建一个新的对象进行返回 然后触发__init__ self.name = 康玉康 第二次实例化对象时 触发__new__ if cls.__obj is None: 条件不满足,返回的是第一次实例化的对象,是同一个 然后触发__init__ self.name = 张保张 """ name = "康裕康" name = "张保障" print(name)
单态
单态模式