我有一个特殊的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