[英]Python : use a class methods as static , when its implemented as instance methods
[英]Listing Implemented Methods in Python Class
我正在研究一個科學代碼,我們希望在其中實現幾個求解器並進行比較。 我們正在使用一個配置文件,我們可以在其中聲明我們希望應用的解算器的名稱。 由於我們不斷添加新的解算器,我將它們包含在一個類中,以便我們可以從配置文件中提取名稱並將其應用於getattr
,而不必在解碼器方法本身之外添加任何新的代碼。 除了這個類中的求解器之外,我沒有實現任何屬性或任何方法。
我還實現了一個錯誤消息,以防所選的解算器不存在。 整個塊看起來像這樣:
try:
solver = getattr(Solvers,control['Solver'])
except AttributeError:
print('\n Invalid Solver Choice! Implemented solvers are: \n' \
+ str(set(dir(Solvers)) - set(dir(Empty)))) # Implemented solvers
raise
solver(inputs) # Call the desired solver
這很方便,因為它通過添加新方法自動更新我們的錯誤處理。 我的問題與那里的錯誤信息有關。 具體來說,我想返回已實現的解算器的列表,並且只返回已實現的求解器的列表。
僅僅列出dir(Solvers)
的輸出是不夠的,因為這包括許多其他方法,如__init__
。 同樣,我無法設置 - 減去dir(object)
的結果,因為這仍然會返回一些額外的東西,如__dict__
和__module__
。 這就是為什么我有類Empty,它只是:
class Empty:
pass
我想知道是否存在比kludgey Empty
類更優雅的方式來實現它。
一種方法是:
set(A.__dict__) - set(type.__dict__)
但是,它仍將返回__weakref__
。 相反,你可以使用:
set(A.__dict__) - set(type("", (), {}).__dict__)
它將您的類與type("", (), {})
。 這會創建一個新的類對象,就像您的Empty一樣,但是更加微妙。 對於示例類:
>>> class A: pass
...
它給:
>>> set(A.__dict__) - set(type("", (), {}).__dict__)
set()
並為:
>>> class B:
... def f(self): pass
...
它返回:
>>> set(B.__dict__) - set(type("", (), {}).__dict__)
{'f'}
你可以做到這一點dir
,如:
>>> set(dir(B)) - set(dir(type("", (), {})))
{'f'}
顯式優於隱式,您可能希望在類中使用非求解器方法。 最簡單明確但干燥的解決方案是只使用裝飾器來標記哪些方法應被視為“解算器”方法:
def solver(fun):
fun.is_solver = True
return fun
class Solvers(object):
@solver
def foo(self):
return "foo"
@solver
def bar(self):
return "bar"
@classmethod
def list_solvers(cls):
return [name for name, attr
in cls.__dict__.items()
if getattr(attr, "is_solver", False)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.