【问题标题】:How to modify a preexisting class in Python in order to add custom methods?如何修改 Python 中预先存在的类以添加自定义方法?
【发布时间】:2021-02-25 03:49:12
【问题描述】:

我是 Python 新手,我正在尝试找到一种方法来将新方法添加到 Python 中预先存在的类中。例如,将.print() 方法添加到列表类中。

我知道我可以创建一个继承列表类的新类并像这样添加这个方法:

    import builtins
    class list(list):
            def print(self):
                    builtins.print(self)

但这不会修改预先存在的“列表”类。我可以做这样的作业:trial_list = list([3,4,6]),但不能这样:trial_list = [3,4,6].

另外,除了dir()help()之外,还有没有办法查看list类的实际内容?

【问题讨论】:

  • 你不能使用内置类型来做到这一点,因为它们是以一种特殊的方式实现的(它们的工作方式是如此基础,以至于用原生 Python 代码表达没有意义)。对于其他类,您可以在不继承的情况下对其进行修改,但这通常是个坏主意。如果你想查找它,它被称为“猴子补丁”,很容易在网络上搜索。
  • 谢谢,还有一种方法可以按照定义的方式查看预定义类中的方法。比如有没有办法查看list类的init方法?
  • Frank Yellin,我查看了您提供的链接,并尝试将 .print() 方法添加到列表类的实例中,但它仍然不起作用。

标签: python python-3.x list class inheritance


【解决方案1】:

推荐的子类内置容器类型的方法是使用collections模块中提供的抽象基类:

如果是list,你应该使用collections.UserList

from collections import UserList

class MySpecialList(UserList):
    def print(self):
        print(self)
        
seq = MySpecialList([1, 2, 3])
print(seq)
seq.print()

您现在可以像使用普通 python list 一样创建 MySpecialList 对象。

子类化要求:UserList 的子类应该提供 一个可以不带参数或一个参数调用的构造函数 争论。列出返回新序列的操作尝试 创建实际实现类的实例。为此,它 假设可以使用单个参数调用构造函数, 这是一个用作数据源的序列对象。

当然,您可以覆盖list 的方法,为您的MySpecialList 提供您需要的行为。

【讨论】:

  • 所以我添加了 import 语句并继承了 UserList 但赋值 try_list = [4,6,8] 仍然不允许我使用 try_list.print()。
  • 不能使用方括号快捷方式创建UserList的子类;这些保留给 python list。您可以通过向构造函数提供所需的参数来创建UserList,正如我的回答中所引用的那样。我在MySpecialList 中添加了一个方法print;您可以使用点表示法来调用它。
  • 但我通过直接继承列表类来做到这一点。为什么我需要继承 collections.UserList?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2021-06-30
相关资源
最近更新 更多