Python - 如何更改模块实现?

标签 python oop inheritance module

我想使用 python-twitter,但扩展 Status 类以添加一些新方法和属性。执行此操作的 pythonic 方法是什么?

目前,我有一些函数可以为 Status 添加属性和新功能,例如

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

prettyprint_status(status):
    # do something...

当然,我只想将额外的方法添加到 Status 构造函数中。我找到了一个 stackoverflow question discussing this它提议创建一个新模块 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 模块,而无需 fork 并制作我自己的版本?

最佳答案

试试这个:

# 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 之后和执行任何其他操作之前立即导入它。

关于Python - 如何更改模块实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16502315/

相关文章:

php - MVC、模型和数据访问对象

iphone - 如何使用 Objective-C 协议(protocol)

java - Hibernate继承、Collections和@OrderedBy父类(super class)属性产生MySQL语法错误

python - 如何使用 scrapy.Request 将另一个页面的元素加载到项目中

python - 如何使用 Sqlalchemy 创建一定长度的整数?

python - 有没有更好的方法来构建它以便打印类/父类的所有属性

java - Java不支持多重继承吗?

python - 如何从 django 上下文中读取 html 中的破折号

python - Psycopg2 --- 插入数组

oop - 为什么命令模式在面向对象的设计中很方便?