用Python实现一个限制创建的类实例数量。提供一个参数max_instance_count来设置最大实例数值(默认为1)

 ###### 问题遇到的现象和发生背景
实现一个限制创建的类实例数量。提供一个参数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、楼上的场景,估计还不一定适合你

这个可以通过第三方库进行实现,不知道是否符合要求