有没有办法覆盖 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
。
我正在准备一道涉及排序的试题。我想禁止学生在他们的解决方案中使用 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
。