【问题标题】:Program to restrict object creation in Python在 Python 中限制对象创建的程序
【发布时间】:2017-09-05 13:29:30
【问题描述】:
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 中所知道的,__new__ 是在需要创建实例时调用的方法。我试着写了一些代码,但是没有用。

当我运行这段代码时,它运行了 6 次。请问有人可以在这里指导我吗?我也尝试在 Google 上进行检查,但没有得到任何正确的代码。

【问题讨论】:

  • 将您的代码发布为代码,而不是图片。
  • 尝试创建第 7 个对象。
  • 我试图发布代码但它给了我错误所以再次发布为图像
  • 我回答了你的问题。

标签: python oop


【解决方案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>

【讨论】:

    【解决方案2】:
    class object_restrict(object):
        _count = 0
    
        def __new__(cls):
            cls._count += 1
            if cls._count > 5:
                raise TypeError("Too many keys created")
    
            print cls._count, "object created"
    
        def __init__(self):
            pass
    
    k = object_restrict()
    k1 = object_restrict()
    k2 = object_restrict()
    k3 = object_restrict()
    k4 = object_restrict()
    k5 = object_restrict()
    

    【讨论】:

      【解决方案3】:

      您将 _count 变量初始化为 0。

      第一次通话:_count = 0

      第六次调用:_count = 5,这样他就可以创建你的对象了。

      初始化 _count = 1 或将你的 if 条件更新为 cls._count &gt;= 5:

      【讨论】:

      • 很高兴为您提供帮助。不要忘记接受这个回答 ;)
      【解决方案4】:

      允许实例化最多 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
      

      【讨论】:

      • 不需要else 子句。
      猜你喜欢
      • 1970-01-01
      • 2017-09-29
      • 2012-06-19
      • 1970-01-01
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-09-15
      相关资源
      最近更新 更多