如何跨类的多个实例维护对python-twitter的调用?

时间:2014-03-17 13:23:17

标签: python python-2.7

我正在编写一个简单的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()的许多实例。这样做的正确方法是什么?

1 个答案:

答案 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]