###### 问题遇到的现象和发生背景
实现一个限制创建的类实例数量。提供一个参数max_instance_count来设置最大实例数值(默认为1)。
引发异常类型试图超过限制创建新实例的错误。如果max_instance_count值等于None,则实例数应该是无限的。
在下面的示例中,C有BoundedMeta元类,因此不能创建超过2个实例。
###### 问题相关代码,请勿粘贴截图
BoundedMeta class boilerplate
class C ( metaclass = BoundedMeta , max_instance_count =2 ):
pass
c1 = C ()
c2 = C ()
try :
c3 = C ()
except TypeError :
print (’ everything works fine !’)
else :
print (’something goes wrong !’)
实现一个类BoundedBase,它有一个抽象的类方法,提供一个允许创建的最大数量的类实例的值。命名该方法为get_max_instance_count。与上一个任务一样,引发一个异常类型错误试图超过限制创建一个新实例。如果get_max_instance_count返回None,那么实例的数量就应该是无限的。在下面的示例中,只允许创建一个从BoundedBase类继承的D类实例。
BoundedBase class boilerplate
class D ( BoundedBase ):
@classmethod
def get_max_instance_count ( cls ):
return 1
d1 = D ()
try :
d2 = D ()
except TypeError :
print (’ everything works fine !’)
else :
print (’something goes wrong !’)
###### 我想要达到的结果
用Python编写程序,写一下注释
这个也是做过的。
class BoundedMeta(type):
number = 0
max_instance_count = 1
@classmethod
def __prepare__(metacls, name, bases, **kargs):
return super().__prepare__(name, bases, **kargs)
def __new__(metacls, name, bases, namespace, **kargs):
return super().__new__(metacls, name, bases, namespace)
def __init__(cls, name, bases, namespace, max_instance_count = 1, **kargs):
BoundedMeta.max_instance_count = max_instance_count
super().__init__(name, bases, namespace)
def __call__(self, *args, **kwargs):
BoundedMeta.number = BoundedMeta.number + 1
if BoundedMeta.max_instance_count is not None:
if BoundedMeta.number > BoundedMeta.max_instance_count:
raise TypeError
class C(metaclass = BoundedMeta , max_instance_count = 2):
pass
c1 = C ()
c2 = C ()
try :
c3 = C ()
except TypeError :
print ('everything works fine !')
else:
print ('something goes wrong !')
1、这个情况好像分场景;
2、楼上的场景,估计还不一定适合你
这个可以通过第三方库进行实现,不知道是否符合要求