说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
(编码题)设计一个名为 GirlFriend 的类,它只允许只能实例化一次,即实现单例模式。要求:
Python 代码如下
class GirlFriend:
_instance = None # 类变量,用于保存女朋友实例
def __new__(cls, *args, **kwargs):
# 实现 __new__ 方法,确保只创建一个女朋友实例
if not cls._instance:
cls._instance = super().__new__(cls)
return cls._instance
else:
raise TypeError('只能创建一个女朋友实例!')
def __init__(self, name, age):
# 实现 __init__ 方法,用于初始化女朋友的属性
self.name = name
self.age = age
实例化示例:
gf1 = GirlFriend('Xiaoli', 22) # 实例化成功
gf2 = GirlFriend('Xiaohong', 23) # 抛出异常
# TypeError: 只能创建一个女朋友实例!
这个代码是一个尝试创建一个名为 GirlFriend 的类,通过实现 __new__
方法来实现单例模式,确保只能创建一个女朋友实例。类中定义了一个类变量 _instance
用于保存女朋友的实例。
让我解释一下每个部分的作用:
__new__
方法:这是一个特殊的方法,用于创建类的实例。在这个例子中,__new__
方法被重写,以确保只有一个女朋友实例。如果 _instance
不存在,就调用父类的 __new__
方法创建实例,然后将实例保存在 _instance
类变量中。如果 _instance
已经存在,就抛出一个 TypeError 异常,表示只能创建一个女朋友实例。__init__
方法:这是初始化方法,用于设置女朋友的属性,如姓名和年龄。这个类的设计意图是让 GirlFriend 类的实例在整个程序中只能有一个,即单例模式。但是,需要注意的是,上述代码可能会出现一个问题,如果创建了一个女朋友实例后,再次尝试创建另一个实例时会抛出异常。在实际应用中,你可能会希望在重复创建实例时返回已经存在的实例而不是抛出异常。可以通过修改 __new__
方法来达到这个目的。
例如,你可以将 __new__
方法的返回值修改为已经存在的实例,而不是抛出异常。这样,如果已经有一个女朋友实例存在,再次创建时就会返回该实例:
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super().__new__(cls)
return cls._instance
或者:
# 代码
class GirlFriend:
_instance = None # 类变量,用于保存女朋友实例
def __new__(cls, name, age):
if cls._instance is None:
cls._instance = super().__new__(cls)
cls._instance.name = name
cls._instance.age = age
return cls._instance
def __init__(self, name, age):
pass
def __str__(self):
return f'<gf: {self.name} {self.age}>'
# 示例用法
gf1 = GirlFriend('Alice', 25)
print(gf1) # 输出: Girlfriend: Alice, Age: 25
gf2 = GirlFriend('Lily', 26)
# 因为已经有一个对象了,所以返回了第一个对象的属性
print(gf2) # 输出: Girlfriend: Alice, Age: 25
print(gf1 is gf2) # 输出 True
这样修改后,当已经存在一个女朋友实例时,再次创建实例就会返回已经存在的那个实例。
查看相关链接中的知识。
(完)
更新时间:2024-08-16 22:49:04 标签:python 习题 单例模式