我正在编写一个简单的python twitter机器人。
我有一个TwitterInterface()
课程:
class TwitterInterface():
def __init__(self):
self.api = twitter.Api(consumer_key=APIKEY, consumer_secret=APISECRET,
access_token_key=TOKENKEY,
access_token_secret=TOKENSECRET)
def get_status(self, twitter_source, since=None):
foo = self.api.blablabla()
我有第二个班级Bot()
处理各种事情,例如存储推特ID并将计算后的字符串发送回TwitterInterface()
。
我希望能够在保留Bot()
的一个实例的同时创建TwitterInterface()
的许多实例。这样做的正确方法是什么?
答案 0 :(得分:1)
实现Singleton Pattern的方法有很多种。有些人认为最好的'这样做的方法是根本没有单身人士,因为单身人士因各种原因而不好。在这种情况下,您必须手动管理,确保每个Bot
都传递正确的TwitterInterface
,可能是Bot
factory。
或者,您可以执行以下操作以获得Python中单例的效果:
class TwitterInterface():
_the_interface = None
def __init__(...): # This should be called once and only once
if TwitterInterface._thie_interface:
raise Exception('There can be only one!')
...
TwitterInterface._the_interface = self
...
@classmethod
def get_interface(cls):
if cls._the_interface:
return cls._the_interface
else:
raise Exception('There is not yet one!')
一旦初始Bot
被构建,所有TwitterInterface
现在可以通过调用TwitterInterface.get_interface()
获得TwitterInterface
的同一副本。
<强>更新强>
请注意,单例模式的一个巨大限制是,在这种情况下,它意味着一次只能有一个用户在您的应用程序中处于活动状态。例如,编写的代码将使得两个TwitterInterface
实例无法使用单独的API密钥,如果这是一个有效的事情(我根本不熟悉twitter.API
对象)。如果这是您可能想要做的事情,Multiton Pattern(也称为注册表)可能会更有用。为此(不使用MetaClass
)
class TwitterInterface():
_the_interface = dict()
def __init__(name, ...): # This should be called once and only once for each name
if TwitterInterface._thie_interface.has_key(name):
raise Exception('There can be only one!')
...
TwitterInterface._the_interface[name] = self
...
@classmethod
def get_interface(cls, name): # This now raises a KeyError if name isn't in the registry
return cls._the_interface[name]