【问题标题】:How to structure code within a python project; classes or modules?如何在 python 项目中构建代码;类或模块?
【发布时间】:2014-01-14 21:02:05
【问题描述】:

我正在尝试在 python 中编写素数模块。我希望能够写的一件事是

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

不过,我也希望能写

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

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

【问题讨论】:

  • 将算法作为字符串参数之一传递?
  • primes.primesLessThan(12, algorithm='sundaram')?
  • 如果它们都是真正的静态类,您可能可以在该类上使用__call__ 函数来完成第一个。

标签: python class module code-structure


【解决方案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))

【讨论】:

  • 这个问题是我不能写 primes.sieves(12)。
  • 好吧,在这种情况下,12 将被分配给一个实例变量,筛选函数将是实例方法而不是静态方法。但是,您真正要完成的只是部分应用程序 - 我认为使用普通函数并将 12 作为参数传递给它们最终会更简单一些。
【解决方案2】:

我能想到两种方法来获得这些语义。

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

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

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

【讨论】:

    猜你喜欢
    • 2013-02-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 2019-04-14
    • 2019-05-28
    相关资源
    最近更新 更多