我正在尝试在python中编写一个primes模块。我希望能写的一件事是
>>> primes.primesLessThan(12)
[2, 3, 5, 7, 11]
但是,我也希望能够写
>>> primes.primesLessThan.Sundaram(12)
[2, 3, 5, 7, 11]
迫使它使用Sundaram的Sieve。我最初的想法是使primesLessThan有一个带有几个静态方法的类,但由于__init__不能返回任何东西,这不能让我实现第一个例子。作为一个单独的模块可以更好地完成进口,还是有其他我错过的东西?
答案 0 :(得分:1)
根据经验,如果你有一个没有任何实例变量的类,一个空的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))
答案 1 :(得分:0)
我能想到两种方法来获得这些语义。
使素数成为一个类,然后使primesLessThan属性。它也是一个类,它实现__iter__
等来模拟列表,同时还有一些子功能。 primesLessThan将是该类的构造函数,该参数具有允许传递的默认值。
让素数本身支持__getitem__
/ __iter__
/等。您仍然可以使用属性(默认情况下),但make primesLessThan只需在类中设置一些内部变量,然后返回self。这允许你以任何顺序执行它们,即primes.Sundaram.primesLessThan(12)的工作方式与primes.primesLessThan.Sundaram(12)相同,但这看起来很奇怪。
其中任何一个在返回值上会有点奇怪......你可以创建一个像列表一样的东西,但显然不会。您可以让repr像列表一样显示它,并且您将能够像列表一样迭代(即for prime in primes.Sundaram(12)
),但由于显而易见的原因它无法返回实际列表....