Совместимость с Python2.x / 3.x: «Ошибка: AttributeError: у объекта« Инструкция »нет атрибута« identity_byte »» - PullRequest
0 голосов
/ 09 октября 2019

Здравствуйте. В настоящее время я сталкиваюсь с сообщением об ошибке заголовка при запуске моей программы. identity_byte четко определен в конструкторе, поэтому я не знаю, почему он его не находит.

На самом деле, Python 2.6 действительно находит его и запускает мою программу без проблем. Но python 3.2 показывает сообщение об ошибке.

Ниже приведен полный вывод о запуске его под Python 3.2 и почти самодостаточный пример кода (код самодостаточен, но ему нужен файл в качестве ввода)

class 'bytes'
class 'int'
120
216
169
Traceback (most recent call last):
  File "test.py", line 76, in <module>
    main () 
  File "test.py", line 73, in main
    cpu.process_instructions ()
  File "test.py", line 58, in process_instructions
    instruction.process ()
  File "test.py", line 18, in process
    print ("Identifier Byte: {}".format(self.identity_byte))
AttributeError: 'Instruction' object has no attribute 'identity_byte'
from abc import ABCMeta, abstractmethod
import argparse

HEADER_SIZE = 16
KB_SIZE = 16384

class Instruction (object):
    __metaclass_ = ABCMeta

    def __init__ (self,identification_byte):
        identity_byte = identification_byte

    def test (self):
        print ("BOTO")

    @abstractmethod
    def process (self):
        print ("Identifier Byte: {}".format(self.identity_byte))

    @abstractmethod
        def process2 (self):
            print ("Identifier Byte2: ", self.identity_byte)


class LDAInstruction (Instruction):
    def process (self):
       super.process ()

    def process2 (self):
       super.process()

 class ROM (object) :
    def __init__ (self, rom_bytes): 
       self.header = rom_bytes [0:HEADER_SIZE]
       self.temp = self.header [4]
       print (type (self.header))
       self.num_prg_blocks = 2#struct.unpack ("I", self.temp)
       print (type (self.num_prg_blocks))
       self.data_bytes = rom_bytes [HEADER_SIZE:HEADER_SIZE + (16 + KB_SIZE * int (self.num_prg_blocks))]
       self.total_size = 16 + KB_SIZE * self.num_prg_blocks

    def get_byte (self, pc):
        return  (self.data_bytes [pc])

class CPU (object):
    def __init__(self, rom_bytes):
        self.registers = []
        self.rom = ROM (rom_bytes)
        self.pc = 0

    def process_instructions (self):
       for byte in self.rom.data_bytes:
          byte = self.rom.get_byte (self.pc)
          self.pc+=1
          print (byte)
          if (byte == 169):
             instruction = Instruction (byte)
             instruction.process ()
             instruction.process2 ()
          if (self.pc == 3):
             break

def main ():

   parser = argparse.ArgumentParser (description='NES EMULATOR'); 
   parser.add_argument ('rom_path',metavar='R',type=str,help='path to the rom')
   args=parser.parse_args()

   with open (args.rom_path, 'rb') as file:
     rom_bytes = file.read ()           

   cpu = CPU(rom_bytes)
   cpu.process_instructions ()

if __name__ == '__main__':
    main () 

Я не знаю, почему это происходит, так как я создаю экземпляр Instruction с:

instruction = Instruction (byte)

, поэтому я ожидаю, что это уже переменная-член identity_byte за это в данном случае.

Спасибо за ваше время.

1 Ответ

1 голос
/ 09 октября 2019

Вы забыли self в строке 11:

identity_byte = identification_byte

Это должно быть

self.identity_byte = identification_byte

Кстати, вам нужно сделать минимально воспроизводимымпример в будущем. Вот мое:

class Foo:
    def __init__(self, bar):
        bar = bar

f = Foo(9)
print(f.bar)

Вывод в Python 3.6:

Traceback (most recent call last):
  File "test.py", line 6, in <module>
    print(f.bar)
AttributeError: 'Foo' object has no attribute 'bar'

Вывод в Python 2.6 такой же, кроме последней строки:

AttributeError: Foo instance has no attribute 'bar'
...