如何在python项目中构造代码;类还是模块?

如何在python项目中构造代码;类还是模块?,python,class,module,code-structure,Python,Class,Module,Code Structure,我正在尝试用python编写一个primes模块。我希望能写的一件事是 >>> primes.primesLessThan(12) [2, 3, 5, 7, 11] 然而,我也希望能够写作 >>> primes.primesLessThan.Sundaram(12) [2, 3, 5, 7, 11] 迫使它使用Sundaram的筛子。我最初的想法是使PrimesLessThat成为一个具有多个静态方法的类,但由于uu init uuu不能返回任何内容,因此

我正在尝试用python编写一个primes模块。我希望能写的一件事是

>>> primes.primesLessThan(12)
[2, 3, 5, 7, 11]
然而,我也希望能够写作

>>> primes.primesLessThan.Sundaram(12)
[2, 3, 5, 7, 11]

迫使它使用Sundaram的筛子。我最初的想法是使PrimesLessThat成为一个具有多个静态方法的类,但由于uu init uuu不能返回任何内容,因此我无法实现第一个示例。作为一个单独的模块来初始化导入会更好吗?或者我还遗漏了什么吗?

根据经验,如果您有一个没有任何实例变量的类,一个空的init方法和一堆静态方法,那么将其作为一个模块来组织可能会更简单

#sieves module
def Sundaram(n):
  return [2,3,5,7]

def Eratosthenes(n):
  return [2,3,5,7]
然后您可以使用模块中的功能

import primes.sieves
primes.sieves.Sundaram(12)
最后,python函数是第一类函数,可以在函数参数中传递,也可以存储在数据结构中。这意味着,如果您需要编写一些依赖于算法选择的代码,您可以将其作为参数传递

def test_first_primes(algorithm):
   return algorithm(10) == [2,3,5,7]

print (test_first_primes(Sundaram))
print (test_first_primes(Eratosthenes))

我可以想出两种方法来获得这些语义

  • 使素数成为类,然后使素数小于属性。它也是一个类,它实现了
    \uu iter\uu
    等来模拟列表,同时还具有一些子函数。primesLessThan将是该类的构造函数,参数具有允许传递的默认值

  • 使素数本身支持
    \uuu getitem\uuuuu
    /
    \uuuu iter\uuuuuu
    /等。您仍然可以使用属性(默认),但使素数不只是在类中设置一些内部变量,然后返回self。这可以让你按任何顺序来做,比如素数。Sundaram。primesLessThan(12)的工作方式与素数。primesLessThan。Sundaram(12)的工作方式相同,但我觉得这很奇怪


其中任何一个在返回值上都会有点奇怪。。。您可以创建类似于列表的内容,但显然不会。您可以让repr像列表一样显示它,并且您可以像列表一样迭代(即primes.Sundaram(12)),但由于明显的原因,它无法返回实际列表……

将算法作为字符串参数之一传递?
primes.primesLessThan(12,algorithm='Sundaram'))
?如果它们都是真正的静态类,您可能可以在类上使用
\uuuu call\uuu
函数来完成第一个。问题是,我将无法编写primes.sieves(12)。在这种情况下,12将被分配给一个实例变量,筛选函数将是实例方法而不是静态方法。然而,您真正需要完成的只是部分应用程序——我认为使用普通fn函数并将12作为参数传递给它们最终会变得更简单。