3

我想使用python-twitter,但扩展Status类以添加一些新方法和属性。这样做的pythonic方法是什么?

目前,我有向 a 添加属性和新功能的函数Status,例如

process_status(status):
    status.datetime = ...
    status.phrase = ...

prettyprint_status(status):
    # do something...

自然,我只想将额外的方法添加到Status构造函数中。我发现了一个讨论这个问题的 stackoverflow 问题,它建议创建一个新模块,ext-twitter其中包含每个类的新实现,如下所示:

# ext_twitter.py
import twitter

class Api(twitter.Api):
    pass

class Status(twitter.Status):
    def __init__(self, *args):
        twitter.Status.__init__(self, *args)
        self.args = args
        self.time = parseTime(self.created_at)
        self.phrase = ...

    def prettyprint(self):
        # something

但是,这不起作用,因为这些Status类是由 Twitter API 对象生成的,并且这里的ext-twitter.Api()调用python-twitter.Api()没有引用我的扩展 Status 类。

有什么方法可以将我的功能添加到 python-twitter 模块而不分叉它并制作我自己的版本?

4

2 回答 2

2

尝试这个:

# patch_twitter.py
import twitter

TwitterStatus = twitter.Status

class Status(TwitterStatus):
     def __init__(self, *args, **kwargs):
        TwitterStatus.__init__(self, *args, **kwargs)
        self.args = args
        self.time = parseTime(self.created_at)
        self.phrase = ...

    def prettyprint(self):
        # something

twitter.Status = Status

# use api

这应该有效,至少对于某些“工作”值而言。如果有任何其他内容捕获了对最初存储在 中的类对象的引用twitter.Status,那么这些引用将不会被更新。这种情况不会经常发生,但它可能是微妙错误的来源。

您需要在导入后立即导入它twitter.py,然后再执行任何其他操作。

于 2013-05-11T22:57:29.473 回答
1

您可以使用组合来向Status对象添加功能,而不是使用继承:

# ext_twitter.py
import twitter

class Api(twitter.Api):
    def method_that_returns_status(self, *args, **kwargs):
        status = super(Api, self).methot_that_returns_status(*args, **kwargs)

        # wrap the original status with your custom status
        return Status(status)


class Status(object):        
    def __init__(self, status):
        self._internal = status

    def __getattr__(self, attr):
        return getattr(self._internal, attr)

    def __setattr__(self, attr, value):
        if attr == '_internal':
            super(Status, self).__setattr__(attr, value)
        else:
            setattr(self._internal, attr, value)

    def prettyprint(self):
        # something
于 2013-05-11T23:01:18.143 回答