我用一个巨大的类处理一个项目。最初,它们是作为刚导入的函数来实现的,比如这个答案:
def plot(self, x, y):
print(self.field)
def clear(self):
# body
@classmethod
def from_file(cls, path):
# body
class Fitter(object):
def __init__(self, whatever):
self.field = whatever
# Imported methods
from .some_file import plot, clear, from_file
...
但我认为这不是最好的解决方案,IDE对代码很着迷,因为它在外部方法中找不到field
,并认为某些函数上的classmethod
是一个错误。我希望mixins能帮上忙。
但我在这种方法中看到了类似的问题:mixin类没有一个包含所有指定的公共方法和字段的基类(Django中的一个例子(,所以IDE和linters也无法找到定义并正确理解代码。。。我尝试使用一些常见的基类,如下所示:
class FitterBase(object):
def __init__(self, whatever):
self.field = whatever
class FiterMixin(FitterBase):
def plot(self, x, y):
print(self.field)
def clear(self):
# body
@classmethod
def from_file(cls, path):
# body
class Fitter(FitterBase, FiterMixin):
pass
但是解释器提出了一个错误:
TypeError:无法创建一致的方法解析
这个问题有解决方案吗?这一点非常重要,因为该类包含数十个大方法,正确的继承会有很大帮助。
Python正试图为Fitter
构建一个MRO,其中FitterBase
在FitterMixin
之前和之后;前者是因为FitterBase
在基类列表中列在第一位,后者是因为它是FitterMixin
的父级。
要解决这个问题,只需交换两个基类的顺序:
class Fitter(FitterMixin, FitterBase):
pass
不过,没有理由同时列出这两个,因为FitterMixin
已经继承自FitterBase
:
class Fitter(FitterMixin):
pass
更明显的是,FitterMixin
在课堂上并不是一个真正的混合体,因为你没有把它和任何东西混合在一起。或者,不要使FitterMixin
成为FitterBase
:的子类
class FitterBase:
def __init__(self, whatever):
self.field = whatever
class FitterMixin:
def plot(self, x, y):
print(self.field)
def clear(self):
pass
@classmethod
def from_file(cls, path):
pass
class Fitter(FitterBase, FitterMixin):
pass