python_类的多态及单态、__new__

# ### 多态 : 不同的子类对象,调用相同的父类方法,产生了不同的执行结果
"""
关键字:继承 改写
"""
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

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

# (1) 基本语法
class MyClass():
	a = 1

obj = MyClass()
print(obj)


class MyClass1(object):
	def __new__(cls):
		print(cls)
		# (1)借助父类object 类.方法()
		# obj = object.__new__(cls)
		# 返回本类自己的对象
		# return obj
		# (2)返回其他类的对象
		# return obj
		# (3)不返回任何对象
		return None
		
obj = MyClass1()
print(obj)
# print(obj.a)

# (2) new方法的触发时机要快于init
"""
__new__  用来创建对象
__init__ 用来初始化对象(前提的有对象)
先创建对象,再去初始化对象,所以new快于init
"""
class Boat():
	def __init__(self):
		print(2)
		
	def __new__(cls):
		print(1)
		return object.__new__(cls)
obj = Boat()

# (3) new方法的参数要和init方法参数一一对象

# 一个参数
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)

# (4) 注意点
"""如果返回的不是本类的对象,不会触发__init__构造方法"""
print("<=====>")
class MyClass():
	a = 1
other_obj = MyClass()

class Boat():
	def __new__(cls):
		return other_obj
	
	def __init__(self):
		print("构造方法被触发~")

obj = Boat()

# ### 单态(例)模式 : 无论实例化多少次,都有且只有一个对象

"""
目的意义:
为了节省内存空间,仅仅是为了调用类中的成员,
不需要额外给该对象添加任何成员,这个场景,使用单态.
比如:操作数据库的增删改查这样的类,是不需要的.
"""

# (1) 基本语法
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)


# (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("王振")
obj2 = Singleton("刘伟")
print(obj1.name)
print(obj2.name)


# 都是王振  王振 刘伟  都是刘伟
"""
obj1 = Singleton("王振") self.name = "王振"
obj2 = Singleton("刘伟") self.name = "刘伟"

obj1 和 obj2 都是同时指向同一个对象,因为对象只创建了一个
对象.name  是获取他后边刘伟那个值,是同一个值打印了2次;
"""

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值