通过委派来缩小python模块的正确方法



我正在努力减少项目模型中的混乱。py和我决定去掉一些模型的"效用"方法。

这个想法是创建一组具有类和函数的实用程序模块,这些类和函数将被模型类使用,但由于没有一段重要的代码不使用其他模型,这导致了循环依赖。例如,在models.py:中

from myproject import parse_util
class Entry(models.Model):
text = models.TextField()
parser = parse_util.Parser(self)
def get_some_object():
return parser.parse_text()
class SomeModel(models.Model):
name = models.CharField(max_length=32, null=False, unique=True)

parse_util.py:中

from myproject.models import SomeModel
class Parser():
def __init__(self, entry):
self.entry = entry
def parse_text(self):
# parsing self.entry.text
...
some_object = SomeModel.objects.get(name=parsed_value)
return some_object

我可以通过直接在函数中导入SomeModel来避免它,而不是在模块范围内进行,或者使用get_model('myapp', 'SomeModel')。但这两个看起来都不太好。

经过一整天的思考,我概括了这个问题:将模块中的一些代码与另一个代码一起移出该模块的正确和蟒蛇式的方法(如果有的话)是什么?

也就是说,如果存在具有classAclassB的模块,并且存在以某种方式同时使用classAclassBclassB的冗长方法,那么有没有什么好的解决方案可以通过将所描述的模块拆分为几个模型来减少所描述的模块,但保留classAclassB的入口点。

因此您有以下硬编码的依赖项:Entry→Parser→SomeModel。

我打破依赖关系的方法是使Parser像这样通用:

class Parser(object):
def __init__(self, entry, model):
self.entry = entry
self.model = model
def parse_text(self):
# parsing self.entry.text
...
some_object = self.model.objects.get(name=parsed_value)
return some_object

现在硬编码的依赖项只是:Entry→分析程序

最新更新