"""
关键字:继承 改写
"""
class Soldier():
def attack():
pass
def back():
pass
class Army(Soldier):
def attack(self):
print("上来拼刺刀,你捅我我捅你,一刀999")
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("弃机跳伞,落地成盒")
obj_army = Army()
obj_navy = Navy()
obj_airforce = AirForce()
lst = [obj_army,obj_navy,obj_airforce]
"""
1.全体出击
2.全体撤退
3.空军上,其他人撤
4.按q键退出
"""
sign = True
while sign:
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()
elif num.upper() == "Q":
print("将军,您辛苦了~")
sign = False
break
else:
print("风太大,我听不见!")
break
'''
触发时机:实例化类生成对象的时候触发(触发时机在__init__之前)
功能:控制对象的创建过程
参数:至少一个cls接受当前的类,其他根据情况决定
返回值:通常返回对象或None
'''
class MyClass():
a = 1
obj = MyClass()
print(obj)
class MyClass1(object):
def __new__(cls):
print(cls)
return None
obj = MyClass1()
print(obj)
"""
__new__ 用来创建对象
__init__ 用来初始化对象(前提的有对象)
先创建对象,再去初始化对象,所以new快于init
"""
class Boat():
def __init__(self):
print(2)
def __new__(cls):
print(1)
return object.__new__(cls)
obj = Boat()
class Boat():
def __new__(cls,name):
return object.__new__(cls)
def __init__(self,name):
self.name = name
obj = Boat("泰坦尼克号")
print(obj.name)
class Boat():
def __new__(cls,*args,**kwargs):
return object.__new__(cls)
def __init__(self,name,a,b,c,d,e):
self.name = name
obj = Boat("泰坦尼克号",2,3,4,5,6)
print(obj.name)
"""如果返回的不是本类的对象,不会触发__init__构造方法"""
print("<=====>")
class MyClass():
a = 1
other_obj = MyClass()
class Boat():
def __new__(cls):
return other_obj
def __init__(self):
print("构造方法被触发~")
obj = Boat()
"""
目的意义:
为了节省内存空间,仅仅是为了调用类中的成员,
不需要额外给该对象添加任何成员,这个场景,使用单态.
比如:操作数据库的增删改查这样的类,是不需要的.
"""
class Singleton():
__obj = None
def __new__(cls):
if cls.__obj is None:
cls.__obj = object.__new__(cls)
return cls.__obj
"""<__main__.Singleton object at 0x000001FB3F207278>
有这个对象直接返回,没这个对象,就给你创建,保证只有一个
第一次实例化时,if cls.__obj is None 条件为真 , 创建一个对象放到cls.__obj , 最后返回
第二次实例化时,if cls.__obj is None 条件为假 , 直接返回
第三次实例化时,if cls.__obj is None 条件为假 , 直接返回
第三次实例化时,if cls.__obj is None 条件为假 , 直接返回
"""
obj1 = Singleton()
print(obj1)
obj2 = Singleton()
print(obj2)
obj3 = Singleton()
print(obj3)
obj4 = Singleton()
print(obj4)
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.name)
print(obj2.name)
"""
obj1 = Singleton("王振") self.name = "王振"
obj2 = Singleton("刘伟") self.name = "刘伟"
obj1 和 obj2 都是同时指向同一个对象,因为对象只创建了一个
对象.name 是获取他后边刘伟那个值,是同一个值打印了2次;
"""