有没有办法覆盖 Python 中现有(系统)class 的方法?

Is there a way to override a method on an existing (system) class in Python?

我正在准备一道涉及排序的试题。我想禁止学生在他们的解决方案中使用 list.sort()。出于这个原因,我正在考虑覆盖该方法(例如通过引发警告的方法)。 Python3 有什么方法可以轻松搞定?使用反射? (或另一种解决方案,使学生无法在他们的代码中使用 list.sort()。)

当然可以,但据我所知,您必须让您的学生使用自定义列表 class 而不是标准列表。 如果这对你想做的没问题,你可以这样做:

import random


class CustomList(list):
    def sort(self, *, key=..., reverse: bool = ...) -> None:
        raise PermissionError("You're not permitted to use the built-in sort function")


if __name__ == '__main__':
    lst = CustomList()
    for _ in range(0, 10):
        lst.append(random.randint(0, 100))

    lst.sort()

请注意,您的学生将无法使用此实现执行 lst = [5, 3, 7, 1, 9] 语法,因为那会调用默认的内置列表实现。

最后我们采用了同事指出的解决方案,为了示例的缘故,这里进行了简化。 forbiddenfruit 中的 curse 函数允许您简单地覆盖现有函数,例如 sort :

from forbiddenfruit import curse
def f ( v ):
    print ( "Error" )
curse(list,"sort", f)
l = [5,4,3,1]
l.sort ()
print (l)

所以在这段代码中,我们将 sort 替换为打印错误的函数,学生不能再依赖传统的 sort