单例 售票员只有一个 实例只有一个
理解单例前需要了解 init 和new
这是init的效果 # 认识new 和init class People(object): # def __new__(cls, *args, **kwargs): # print("执行了new") # return object.__new__(cls) def __init__(self,name,age): print("执行了init") self.name= name self.age= age p=People("Jack",18) print(p)# 打印p的地址 ''' 执行了init <__main__.People object at 0x000001E0371036A0> '''
这是额外添加了new之后的效果,仅执行了new 没有执行init # 认识new 和init class People(object): def __new__(cls, *args, **kwargs): print("执行了new") # return object.__new__(cls) def __init__(self,name,age): print("执行了init") self.name= name self.age= age p=People("Jack",18) print(p)# 打印p的地址 ''' 执行了new None '''
这是在new中加入了return后的效果,既执行了new又执行了init # 认识new 和init class People(object): def __new__(cls, *args, **kwargs): print("执行了new") return object.__new__(cls) def __init__(self,name,age): print("执行了init") self.name= name self.age= age p=People("Jack",18) print(p)# 打印p的地址 ''' 执行了new 执行了init <__main__.People object at 0x0000025E4CEB38B0> '''
单例的意义就是保证 创建一个实例
第一部分:没用单例之前 出现了4个公交车司机;第二部分 使用单例后,每次只有一个公交车司机; class BusDriver: def __init__(self):# 定义公交车司机的姓名和卖票张数 self._BusDriver_name='BusDriver-Jack'# 姓名 self._sum=0 # 卖票张数 def sell(self,Passenger_name): print('司机%s,给乘客%s卖了一张票'%(self._BusDriver_name,Passenger_name)) self._sum+=1 # 合计买票数 def getsum(self): return self._sum class Passenger: def __init__(self,Passenger_name): self._Passenger_name=Passenger_name # 乘客的姓名 def buy(self): bus_driver= BusDriver() # 调用司机类 bus_driver.sell(self._Passenger_name) #调用司机类中 卖票方法 sum_sum=bus_driver.getsum() # 调用司机类中获得卖票总数 print(sum_sum) li= ['Mary','John','Lucy','Amy'] for one in li: Passenger(one).buy()
'''
司机BusDriver-Jack,给乘客Mary卖了一张票
1
司机BusDriver-Jack,给乘客John卖了一张票
1
司机BusDriver-Jack,给乘客Lucy卖了一张票
1
司机BusDriver-Jack,给乘客Amy卖了一张票
1
'''
class BusDriver: # 创建一个自己self 初始化None _self= None _name = 'BusDriver-Jack' # _name 司机的姓名 _sum = 0 # 卖票张数 # _flag= False # 创建单例 def __new__(cls,*args,**kwargs): if cls._self is None: cls._self= super().__new__(cls)#创建一个新的自己self return cls._self def sell(self,nameP):# 传入乘客的姓名 print('司机%s,给乘客%s卖了一张票'%(self._name,nameP)) self._sum+=1 # 合计买票数 def getsum(self): return self._sum class Passenger: def __init__(self,nameP): self._nameP=nameP # 乘客的姓名 def buy(self): bus_driver= BusDriver() # 调用司机类 bus_driver.sell(self._nameP) #调用司机类中 卖票方法 sum_sum=bus_driver.getsum() # 调用司机类中获得卖票总数 print(sum_sum) li= ['Mary','John','Lucy','Amy'] for one in li: Passenger(one).buy()
'''
司机BusDriver-Jack,给乘客Mary卖了一张票
1
司机BusDriver-Jack,给乘客John卖了一张票
2
司机BusDriver-Jack,给乘客Lucy卖了一张票
3
司机BusDriver-Jack,给乘客Amy卖了一张票
4
'''