class MusicPlayer(object): def __new__(cls, *args, **kwargs): # When you create an object, the new method is called automatically. print('Create objects, allocate space') def __init__(self): print('Initialization') music= MusicPlayer() print(music)
If the return value is not used, the address cannot be found. Moreover, class properties are not running. (initialization not printed)
class MusicPlayer(object): def __new__(cls, *args, **kwargs): # When you create an object, the new method is called automatically. print('Create objects, allocate space') return super().__new__(cls) def __init__(self): print('Initialization') music= MusicPlayer() print(music)
class MusicPlayer(object): pass player1 = MusicPlayer() player2 = MusicPlayer() print(player1) print(player2)
When you create different objects, the addresses are different. But in singleton design mode, no matter how many objects are created, the address is the same. As follows:
class MusicPlayer(object): instance = None def __new__(cls, *args, **kwargs): if cls.instance is None: cls.instance = super().__new__(cls) return cls.instance player1 = MusicPlayer() player2 = MusicPlayer() print(player1) print(player2)
The address is exactly the same.
class MusicPlayer(object): instance = None def __new__(cls, *args, **kwargs): if cls.instance is None: cls.instance = super().__new__(cls) return cls.instance def __init__(self): print('Initialization') player1 = MusicPlayer() player2 = MusicPlayer() print(player1) print(player2)
You can see that it was initialized twice. But we only want to initialize once.
class MusicPlayer(object): instance = None init_flage = False def __new__(cls, *args, **kwargs): if cls.instance is None: cls.instance = super().__new__(cls) return cls.instance def __init__(self): if MusicPlayer.init_flage: return print('Initialization') MusicPlayer.init_flage = True player1 = MusicPlayer() player2 = MusicPlayer() print(player1) print(player2)
Initialization was performed only once.