如何限制对象创建

时间:2014-09-04 11:13:42

标签: python python-2.7

考虑以下示例

class Key:
    def __init__(self, s):
        self.s = s

d = {}

for x in range(1, 10000):
    t = Key(x)
    d[t] = x

这将创建10000个键。是否可以控制类键的对象创建,例如我们不能创建超过5个键类对象。不应以任何方式改变循环。

2 个答案:

答案 0 :(得分:7)

您可以通过为您的班级__new__ method

来控制创建对象的方式或对象数量
class Key(object):
    _count = 0

    def __new__(cls, s):
        if cls._count == 5:
            raise TypeError('Too many keys created')

        cls._count += 1
        return super(Key, cls).__new__(cls, s)

    def __init__(self,s):
        self.s = s
调用

Key.__new__()来创建一个新实例;在这里我会计算创建了多少,如果有太多,则会引发异常。您还可以在字典中保留实例池,或以其他方式控制新实例的创建。

请注意,这仅适用于new-style classes,继承自object

答案 1 :(得分:0)

您还可以使用元类方法

import weakref
import random

class FiveElementType(type):
    def __init__(self, name, bases, d):
        super(FiveElementType, self).__init__(name, bases, d)
        self.__cache = weakref.WeakValueDictionary()

    def __call__(self, *args):
       if len(self.__cache) == 5:
           return random.choice(self.__cache.values())
       else:
           obj = super(FiveElementType, self).__call__(*args)
           self.__cache[len(self.__cache)] = obj
           return obj

class Key(object):
    __metaclass__ = FiveElementType
    def __init__(self, s):
       self.s = s

您可以选择随机元素,也可以在存储索引的基础上选择它。在这种方法中,根据您的意图,您的循环不会因为可能正确与否的异常而失败。