我正在尝试用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)
),但由于明显的原因,它不能返回实际的列表。。。。