【发布时间】:2013-08-25 22:27:57
【问题描述】:
大家好,我是新来的,但希望我的问题很清楚。
我的代码是用 Python 编写的。 我有一个代表一般网站的基类,这个类包含一些从网站获取数据并保存的基本方法。该类由许多其他类扩展,每个类代表一个不同的网站,每个类都持有特定于该网站的属性,每个子类都使用基类方法来获取数据。所有站点都应在其上解析数据,但许多站点共享相同的解析功能。所以我创建了几个解析类,它们包含不同解析方法的功能和属性(我有大约六个)。我开始思考将这些类与需要它们的网站类集成的最佳方式是什么。
一开始我以为每个网站类都会保存一个类变量和对应的解析器类,但后来我认为必须有更好的方法来做到这一点。
我读了一点,并认为依靠 Mixins 为每个网站集成解析器可能会更好,但后来我认为虽然这会起作用,但它并不“听起来”正确,因为网站类没有业务继承自解析器类(甚至认为它只是一个 Mixin,并不意味着完全继承类),因为除了网站使用解析器功能之外,它们没有任何关系。
然后我想我可能会依靠我看到的一些依赖注入代码来将解析器注入到每个网站,但这听起来有点矫枉过正。
所以我想我的问题基本上是,什么时候最好使用每种情况(在我的项目和任何其他项目中),因为它们都可以完成这项工作,但似乎并不是最合适的。
感谢您提供的任何帮助,我希望我很清楚。
添加一个小模拟示例来说明:
class BaseWebsite():
def fetch(): # Shared by all subclasses websites
....
def save(): # Shared by all subclasses websites
....
class FirstWebsite(BaseWebsite): # Uses parsing method one
....
class SecondWebsite(BaseWebsite): # Uses parsing method one
....
class ThirdWebsite(BaseWebsite): # Uses parsing method two
....
等等
【问题讨论】:
-
附带说明:如果这是 Python 2.x,
class BaseWebsite():会为您提供您不想要的旧式类;使用class BaseWebsite(object):。如果这是 Python 3.x,class BaseWebsite():会做正确的事,但class BaseWebsite:也是如此,它更干净、更易读。并且更惯用。无论哪种方式,class BaseWebsite():看起来您都在尝试用这些括号做某事,并让读者想知道您在尝试做什么。
标签: python oop dependency-injection mixins