在Python中重写类的方法
我想要重写一个类的方法,而不是创建一个子类或者从一个类扩展。
举个例子:
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"