我有一個特殊的statemachine在Python中實現,它使用類方法作爲狀態表示。我可以從Python中的classmethod派生嗎?
class EntityBlock(Block):
def __init__(self, name):
self._name = name
@classmethod
def stateKeyword1(cls, parserState : ParserState):
pass
@classmethod
def stateWhitespace1(cls, parserState : ParserState):
token = parserState.Token
if isinstance(token, StringToken):
if (token <= "generate"):
parserState.NewToken = GenerateKeyword(token)
parserState.NewBlock = cls(....)
else:
raise TokenParserException("....", token)
raise TokenParserException("....", token)
@classmethod
def stateDelimiter(cls, parserState : ParserState):
pass
訪問GitHub的完整的源代碼關閉pyVHDLParser。
當調試我的解析器FSM,我得到打印爲statenames:
State: <bound method Package.stateParse of <class 'pyVHDLParser.DocumentModel.Sequential.Package.Package'>>
我想獲得更好的報告,所以我想覆蓋的每個邊界的__repr__
默認行爲方法對象。
是的,我可以寫一個元類或申請第二個裝飾,但我質問自己:
是否有可能從classmethod
派生並已例如被稱爲只有一個裝飾state
?
根據PyCharm的builtins.py(Python內置僞代碼的集合),classmethod是一個基於類的裝飾器。
做這些classmethods的原因是什麼?它使得'EntityBlock'實際上是一個單例,但即使你只創建了一個實例,它也顯得更加複雜。特別是,如果你從不創建任何實例,'__init__'永遠不會被調用。如果你確實創建實例,它們將共享狀態,這似乎不太有用。 – cco
這是一個最小的例子。 EntityBlock將被創建,否則它將不會有'__init__' ...不,它們不共享狀態,因爲「狀態」不是類的方法。該類是分層狀態機中的一組狀態。無論如何,它不回答我的問題,對吧? – Paebbels
對。我的評論並不是針對你的問題,而只是對我看起來很奇怪的事情做出反應。 – cco