在Python中重写类的方法

2 投票
7 回答
2543 浏览
提问于 2025-04-16 07:20

我想要重写一个类的方法,而不是创建一个子类或者从一个类扩展。

举个例子:

from django.contrib import admin

class NewModelAdmin(admin.ModelAdmin):
    def formfield_for_dbfield(self, db_field, **kwargs):
        # some custom stuff

现在我不想把所有从 admin.ModelAdmin 继承的类(也就是模型)都改成 NewModelAdmin。但我也不想修改原来的 Django 代码。

有没有什么办法可以做到这一点呢?

7 个回答

3

为了让你的代码更容易维护,最好让你每个单独的 ModelAdmin 类都继承自 NewModelAdmin。这样,其他开发者在查看你的代码时(也许你自己在一两年后回头看),就能清楚地看到自定义的 formfield_for_dbfield 行为是从哪里来的,这样如果需要更新就会方便很多。如果你直接修改 admin.ModelAdmin 的代码,就会让后续查找问题或者改变行为变得更加困难。

3
4

我不太明白你想要做什么,以及为什么你不想创建一个新的子类或者使用不同名字的方法。

不过一般来说,在Python中你可以这样做:

class MyClass(object):
    def print_hello(self):
        print "not hello"

def real_print_hello():
    print "hello"

x = MyClass()
x.print_hello() # "not hello"
setattr(x, "print_hello", real_print_hello)
x.print_hello() # "hello"

撰写回答