Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在何处放置作用于特定类的两个实例的函数_Python_Design Patterns - Fatal编程技术网

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)

发现,这听起来像是许多像这样使用它的好理由。