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



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

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

然而,我也希望能够写

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

迫使其使用Sundaram筛。我最初的想法是让primesLessThan成为一个有几个静态方法的类,但由于__init__不能返回任何东西,这并没有让我实现第一个例子。这会更好地作为一个单独的模块来进行导入,还是我错过了其他东西?

根据经验,如果您有一个没有任何实例变量的类,一个空的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))

我可以想到两种方法,来获得这些类型的语义。

  • 将素数设为类,然后将素数LessThan设为属性。它也是一个类,实现__iter__等来模拟列表,同时还具有一些子功能。primesLessThan将是该类的构造函数,参数具有允许传递的默认值。

  • Make素数本身支持__getitem__/__iter__/等。您仍然可以使用属性(默认情况下),但make primesLessThan只需在类中设置一些内部变量,然后返回self。这可以让你按任何顺序进行,即素数。Sundarm.primesLessThan(12)的工作方式与primes.primesLessThan.Sundaram(12)相同,不过,这对我来说很奇怪。

其中任何一个在返回值上都会有点奇怪。。。你可以创建一个类似列表的东西,但显然不会。你可以让repr像列表一样显示它,你可以像列表一样迭代(即for prime in primes.Sundaram(12)),但由于明显的原因,它不能返回实际的列表。。。。

相关内容

  • 没有找到相关文章

最新更新