2017-04-10 39 views
0
class object_restrict(object): 
    _count = 0 

    def __new__(cls): 
     if cls._count > 5: 
      raise TypeError("Too many keys created") 

     cls._count += 1 
     print "object created" 

    def __init__(self): 
     pass 

k = object_restrict() 
k1 = object_restrict() 
k2 = object_restrict() 
k3 = object_restrict() 
k4 = object_restrict() 
k5 = object_restrict()  

看来我对如何限制Python中某个类的对象数量有一些疑问。我被要求编写一个程序,在该程序中,我应该把我们只能创建一个类的5个实例的条件,如果我们尝试创建超过5个,它应该引发一个异常。限制在Python中创建对象的程序

正如我们在Python中所知道的,__new__是在需要创建实例时调用的方法。我试图编写一些代码,但它不起作用。

当我运行这个代码时,它全部运行了6次。请有人在这里指导我吗?我也试着检查Google,但没有得到任何正确的代码。

+3

安置自己的代码作为代码,而不是为图片。 –

+1

尝试创建第7个对象。 –

+0

我试图发布代码,但它给了我错误,所以再次张贴为图像 – Anendra

回答

0

你初始化你_count变量为0

第一次调用:_count = 0

第六电话:_count = 5,所以他可以创建你的对象。

初始化_count = 1或更新您如果条件cls._count >= 5:

+0

你好,非常感谢。它正在工作 – Anendra

+0

很高兴为您效劳。不要忘记接受这个anwser;) – Wilfried

1

Wilfred指出有与_count支票或变量初始化的问题。但我想指出另一个问题,那就是你没有返回对象的实例。如果你有这样的:

class A(object): 

    _count = 0 

    def __new__(cls): 
     if cls._count > 5: 
      raise Exception('Too many instances were created') 
     cls._count += 1 

    def __init__(self): 
     pass 

asd = A() 
print asd 

将输出:

$ None 

你应该返回对象,这实际上是__new__责任的实例:

class A(object): 

    _count = 0 

    def __new__(cls): 
     if cls._count >= 5: # @Wilfred fix 
      raise Exception('Too many instances were created') 
     cls._count += 1 
     return super(A, cls).__new__(cls) # returning the instance 

    def __init__(self): 
     pass 

asd = A() 
print asd 

输出:

$ <__main__.A object at 0x7f5ddad7db10> 
0

,其允许最大5个对象的类被实例化(Python 3中):

class RestrictClass(object): 
    __count = 0 
    def __new__(cls): 
     if cls.__count>=5: 
      raise TypeError("Already instantiated") 
     cls.__count+=1 
     return super(RestrictClass,cls).__new__(cls) 

    def __init__(self): 
     pass 

    def showNumberOfObjects(self): 
     print("Number of objects are now: "+str(self.__count)) 


k1 = RestrictClass() 
k1.showNumberOfObjects() 
k2 = RestrictClass() 
k2.showNumberOfObjects() 
k3 = RestrictClass() 
k3.showNumberOfObjects() 
k4 = RestrictClass() 
k4.showNumberOfObjects() 
k5 = RestrictClass() 
k5.showNumberOfObjects() 
k6 = RestrictClass() 
k6.showNumberOfObjects() 

输出:

Number of objects are now: 1 
Number of objects are now: 2 
Number of objects are now: 3 
Number of objects are now: 4 
Number of objects are now: 5 
Traceback (most recent call last): 
    File "/media/arsho/Documents/pyPrac/object.py", line 27, in <module> 
    k6 = RestrictClass() 
    File "/media/arsho/Documents/pyPrac/object.py", line 5, in __new__ 
    raise TypeError("Already instantiated") 
TypeError: Already instantiated 
+0

不需要'else'子句。更新了 – odradek

+0

。谢谢 :) – arsho