Python 在何处放置作用于特定类的两个实例的函数
这确实是一个设计问题,我想知道使用什么样的设计模式 我有一个模块,比如说Python 在何处放置作用于特定类的两个实例的函数,python,design-patterns,Python,Design Patterns,这确实是一个设计问题,我想知道使用什么样的设计模式 我有一个模块,比如说curves.py,它定义了一个Bezier类。然后我想编写一个函数intersection,它使用递归算法来查找Bezier的两个实例之间的交点 我有哪些选项可以将这些函数放置在何处?在这种情况下,有哪些最佳做法?目前,我已经在模块本身中编写了函数(而不是作为类的方法) 所以现在我有一些类似的东西: def intersections(inst1, inst2): ... def Bezier(): ... 我可以
curves.py
,它定义了一个Bezier
类。然后我想编写一个函数intersection
,它使用递归算法来查找Bezier
的两个实例之间的交点
我有哪些选项可以将这些函数放置在何处?在这种情况下,有哪些最佳做法?目前,我已经在模块本身中编写了函数(而不是作为类的方法)
所以现在我有一些类似的东西:
def intersections(inst1, inst2): ...
def Bezier(): ...
我可以通过传递两个实例来调用该函数:
from curves import Bezier, intersections
a = Bezier()
b = Bezier()
result = intersections(a, b)
然而,另一个选择(我可以想到)是将intersection
作为类的一个方法。在这种情况下,我将使用
a.intersections(b)
对我来说,第一个选择更有意义,因为调用交叉点(a,b)
比a.交叉点(b)
感觉更自然。但是,另一个选项感觉更自然,因为函数intersection
实际上只作用于Bezier
实例,这感觉更为封装
你认为其中一个比另一个好吗?在这种情况下,原因是什么?这里还有其他的设计选项吗?有什么最佳实践吗?例如,您可以比较内置类如何做到这一点: 交叉口(*其他)
设置和其他&……
返回一个新集合,其中包含集合和所有其他集合共有的元素 因此,
intersection
被定义为类上的一个常规实例方法,它接受另一个(或多个)集并返回交集,它可以被称为a.intersection(b)
然而,由于实例方法如何工作的标准机制,您还可以拼写它set.intersection(a,b)
,在实践中,您会经常看到这一点,因为正如您所说,它感觉更自然
您还可以覆盖\u和
方法,使其成为a&b
可用
就易用性而言,将其放在类中也更友好,因为您只需导入
Bezier
类,并自动提供所有相关功能,而且它们也可以通过help(Bezier)
发现,这听起来像是许多像这样使用它的好理由。