簡體   English   中英

為一堆 static 方法提供命名空間的最佳實踐是什么?

[英]What is the best practice to give a namespace for a bunch of static methods?

我需要一個模塊中的命名空間,用於執行類似工作的許多不同 static 方法。 從我的研究中我了解到,在 Python 編程中,擁有一個充滿 static 方法的 class 被認為是反模式:

class StatisticsBundle:
  @staticmethod
  def do_statistics1(params):
     pass

  @staticmethod
  def do_statistics2(params):
     pass

如果這不是一個好的解決方案,那么最好的做法是什么?它允許我在同一個模塊中進行類似getattr(SomeNameSpace, func_name)的命名空間查找?

使用 package。 將函數放在單獨的模塊中,而不使用 class。

在您計算機上的統計文件夾中定義 2 個模塊:

  1. helpers.py用於定義輔助函數。
  2. __init__.py用於編寫大部分代碼的地方。

如果您可以為您在其中定義的一組函數想出一個更好的名稱,您可以重命名helpers模塊。 但是,package 的__init__模塊是特殊的。 當 package 被導入時, __init__模塊被賦予 package 名稱並被評估。

要應用您的示例:

#statistics\helpers.py

def do_statistics1(params):
     pass

def do_statistics2(params):
     pass

# Rest of module omitted
#statistics\__init__.py
# Relative import
from . import helpers
# Get function using getattr()
do_statistics1 = getattr(helpers, "do_statistics1")
# Get function using dot notation
do_statistics2 = helpers.do_statistics2

# Rest of module omitted

請務必通過導入來測試 package。 評估 package 中的模塊時,相對導入不起作用。

總之,您可以像從 class 中一樣從模塊中獲取屬性。

[...] 最佳getattr(SomeNameSpace, func_name)是什么?

Python 函數是一流的函數 因此,最簡單的命名空間是dict (實際上與實例命名空間在__dict__上的工作方式相距不遠)。 如果你想實現一種工廠 function,它只是:

def _create_foo():
    return Foo(...)

def _create_bar():
    return Bar(...)


_my_ns = {
    'foo': _create_foo,
    'bar': _create_bar,
}

def my_factory(name):
    return _my_ns[name]()

同樣在運行時(考慮到staticmethod方法描述符在 Python 3 中的工作方式)它們將具有相同的types.FunctionType

>>> class ns:
...     
...     @staticmethod
...     def foo():
...         pass
... 
... type(ns.foo)
<class 'function'>
>>> type(_my_ns['foo'])
<class 'function'>

根據您的 python 版本,您可能可以使用SimpleNamespace

import types

def foo():
    print("foo")

def bar():
    print("bar")

namespace = types.SimpleNamespace(foo=foo, bar=bar)
namespace.foo()
namespace.bar()

我需要一個模塊中的命名空間,用於執行類似工作的許多不同 static 方法。 從我的研究中我了解到,在 Python 編程中,擁有一個充滿 static 方法的 class 被認為是反模式:

class StatisticsBundle:
  @staticmethod
  def do_statistics1(params):
     pass

  @staticmethod
  def do_statistics2(params):
     pass

如果這不是一個好的解決方案,那么最好的做法是什么?它允許我在同一個模塊中進行類似getattr(SomeNameSpace, func_name)的命名空間查找?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM