考虑以下示例
class Key:
def __init__(self, s):
self.s = s
d = {}
for x in range(1, 10000):
t = Key(x)
d[t] = x
这将创建10000个键。是否可以控制类键的对象创建,例如我们不能创建超过5个键类对象。不应以任何方式改变循环。
答案 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
您可以选择随机元素,也可以在存储索引的基础上选择它。在这种方法中,根据您的意图,您的循环不会因为可能正确与否的异常而失败。