关于python:如何从其他模块向Django类添加新方法?

How to add new method to Django class from other modules?

本问题已经有最佳答案,请猛点这里访问。

我有一个Django模特说:

1
2
3
4
5
class MyOperation(models.Model):
    name = models.CharField(max_length=100)

    def my_method(self):
        pass

我想从另一个Django应用程序向这个类添加一个新方法。

我尝试从另一个名为custom.py的应用程序模块执行此操作:

1
2
3
4
5
6
from operations.models import MyOperation

def op_custom(test):
    print"testing custom methods"

MyOperation.op_custom = op_custom

但是,这似乎不起作用,在运行时,该方法不存在。

这是从不同的django应用程序修改类定义的方法吗?有更好的方法吗?

谢谢


正确的方法?要做到这一点,需要通过混音器:

1
2
3
4
5
6
7
class MyMixIn(object):
    def op_custom(self):
        print("foo")

class MyOperation(models.Model, MyMixIn):
    def op_normal(self):
        print("bar")

与另一种方法中的猴子修补相比,这有几个优点:

  • mixin是类的方法解析顺序,因此内省工作得很好。
  • 它保证在类的每个实例上定义,不管它在何处实例化,因为类本身继承自mixin。否则,在应用monkey补丁之前,如果没有此方法,您可能会得到一些实例。
  • 它为将来添加此类方法提供了一个明显的位置。