我用Python编写了一个StateMachine
类,这样就可以从中继承。它的逻辑按预期工作,但我可以从名为StateMachineTest
的派生StateMachine
类中存在的StateMachineTest
状态访问属性self.data
。
生成以下错误:
Traceback (most recent call last): File "/home/nbout/work/python/state_machine/main.py", line 68, in main() File "/home/nbout/work/python/state_machine/main.py", line 59, in main test = StateMachineTest() File "/home/nbout/work/python/state_machine/main.py", line 47, in __init__ StateMachine.__init__(self, Started()) File "/home/nbout/work/python/state_machine/state_machine.py", line 17, in _init__ self.current_state.on_enter(self) File "/home/nbout/work/python/state_machine/main.py", line 16, in on_enter print("Started: data:{}".format(sm_test.data)) Started: on_enter AttributeError: 'StateMachineTest' object has no attribute 'data' Started: on_exit
state_machine.py
class State:
def on_enter(self, state_machine):
pass
def on_exit(self, state_machine):
pass
class StateMachine:
def __init__(self, start_state):
self.current_state = start_state
self.current_state.on_enter(self)
def __del__(self):
self.current_state.on_exit(self)
def set_state(self, state):
self.current_state.on_exit(self)
self.current_state = state
self.current_state.on_enter(self)
main.py
from state_machine import StateMachine
from state_machine import State
class StateTest(State):
def pause(self, state_machine_test):
pass
def start(self, state_machine_test):
pass
class Started(StateTest):
def on_enter(self, sm_test):
print("Started: on_enter")
print("Started: data:{}".format(sm_test.data))
def on_exit(self, sm_test):
print("Started: on_exit")
def pause(self, sm_test):
print("Started: pause")
sm_test.set_state(Paused())
def start(self, sm_test):
print("Started: start")
class Paused(StateTest):
def on_enter(self, sm_test):
print("Paused: on_enter")
def on_exit(self, sm_test):
print("Paused: on_exit")
def pause(self, sm_test):
print("Paused: pause")
def start(self, sm_test):
print("Paused: start")
sm_test.set_state(Started())
class StateMachineTest(StateMachine):
def __init__(self):
StateMachine.__init__(self, Started())
self.data = 10
def pause(self):
self.current_state.pause(self)
def start(self):
self.current_state.start(self)
def main():
test = StateMachineTest()
test.start()
test.pause()
test.pause()
test.start()
if __name__ == '__main__':
main()
哇,这段代码真是不必要的复杂。
问题似乎是您在StateMachineTest类的\uuuu init\uuuu
中初始化了start
,以便在设置self.data
之前,其on\u enter
运行。
您可以通过将self.data
的赋值移动到super
调用上方来解决此问题,但更好的办法是简化继承层次结构。
您的问题在于,StateMachine.\uuuu init\uuuuuuself(self,start())
要求已设置self
的数据属性,但您只在下一行设置它(
self.data=10
)。切换这两条线路,然后重试!
> RDF/OWL中继承的含义是什么? 是否可以用OWL/RDF构造面向对象语言类型的类-子类继承? 请考虑以下示例。是否“讲师”和“学生”的所有属性都将提供给“人”类? 如果有人提供给我一个很好的例子,这将是非常有帮助的答案。提前谢谢你。
我有以下基类和子类: 在我的代码中,我正在检查一个类的实例,检查一个我知道存在于基类中的字段-我希望它默认为值。但是,我的代码引发了以下异常: AttributeError:“TypeTwoEvent”对象没有属性“foobar” 我的印象是基类字段将被子类继承,创建子类的实例将实例化基类(从而调用其构造函数)... 我在这里错过了什么?为什么没有属性-当派生它的基类具有属性时?
问题内容: 我有以下基类和子类: 在我的代码中,进一步,我正在检查一个类的实例,检查我知道在基类中存在的字段-我希望将其默认为value 。但是,我的代码引发以下异常: AttributeError:“ TypeTwoEvent”对象没有属性“ foobar” 我的印象是,基类字段将由子类继承,并且创建子类的实例将实例化基类(从而调用其构造函数)… 我在这里想念什么?为什么没有一个属性-当其所来源
我似乎找不到有关自定义异常类的太多信息。 我所知道的 您可以声明您的自定义错误类并让它从继承,因此可以是d: 这允许您使用以下方法提升它: 稍后,在救援时获取该消息 我不知道的是 我想给我的异常提供一些自定义字段,但我想从父类继承<code>消息@message不是exception类的实例变量,因此我担心我的继承将不起作用。 有人能告诉我更多细节吗?如何使用<code>对象 然后: 得到: 它会
在面向对象的程序设计中,定义一个新的 class 的时候,可以从某个现有的 class 继承,新的 class 称为子类,而被继承的 class 称为基类、父类或超类。 Python 中继承的语法如下: class Parent: pass class Child(Parent): pass 在第 1 行,定义了父类 Parent; 在第 4 行,定义了子类 Child,语法
我有一个MyClass,它的属性类型为MyAttribute。该类由MySubClass继承,其属性类型为MySubAttribute。MySubAttribute是MyAttribute的子类: 现在假设我有以下代码: 如何生成MySubAttribute类型的返回值?