当前位置: 首页 > 知识库问答 >
问题:

Python类继承,属性错误

丘学海
2023-03-14

我用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()

共有2个答案

米楷
2023-03-14

哇,这段代码真是不必要的复杂。

问题似乎是您在StateMachineTest类的\uuuu init\uuuu中初始化了start,以便在设置self.data之前,其on\u enter运行。

您可以通过将self.data的赋值移动到super调用上方来解决此问题,但更好的办法是简化继承层次结构。

罗波鸿
2023-03-14

您的问题在于,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类型的返回值?