Экземпляр дочернего класса Python не может получить доступ к родительским переменным - PullRequest
1 голос
/ 11 июня 2019

Вот фон.Я делаю игру на Python 3.7 с использованием библиотеки Pyglet.Я пытаюсь получить доступ только к логической переменной с именем dead, которая инициируется в функции __init__ родительского класса.В дочернем классе я вызывал функцию __init__ родителя в собственной __init__ дочерней функции.Всякий раз, когда я пытаюсь получить доступ к переменной dead из родительских методов, унаследованных от дочернего класса, я получаю сообщение об ошибке, что дочерний класс не может найти переменную.

Родительский класс называется PhysicalObject в Physicalobject.py:

import pyglet

class PhysicalObject(pyglet.prite.Sprite):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.dead = False

Дочерний класс называется Player в player.py (тот же каталог, что и physobject.py. Каталог называется game)

import pyglet
from game import physicalobject

class Player(physialobject.PhysicalObject):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        print(self.dead)

Наконец, из основного файла сценария один уровень каталогамы собираем все вместе и создаем игрока:

import pyglet
from game import player

p = player.Player()

Я не уверен, почему ребенок не может видеть self.dead в последней строке здесь print(self.dead), но я знаю, что не понимаючто-то правильно о наследовании.Я не привык к Python, но в других языках программирования мы сначала определяем наши переменные до __init__, и я знаю, что в Python это приведет к статической переменной, но, похоже, это единственный способ получить результат:ищуЯ искал часы, пытаясь заставить это работать, выполняя каждое предложение, уже просимое о переполнении стека, но безуспешно.

Точная ошибка ниже:

AttributeError: 'Player' object has no attribute 'dead'

РЕДАКТИРОВАТЬ: Технически на это никогда не отвечали, но, пытаясь сделать то же самое, что и голые кости, насколько я мог, я заставил этот сценарий barebones работать с использованием того же стилизованного синтаксиса, что и выше.Мне нужно разбить свой проект дальше, чтобы точно понять, что происходит, но когда я узнаю, я вернусь, чтобы пересмотреть этот пост снова.

1 Ответ

0 голосов
/ 11 июня 2019
import pyglet

class PhysicalObject(pyglet.sprite.Sprite):
  def __init__(self, *args, **kwargs):
    self.dead = False

class Player(PhysicalObject):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    print(self.dead)

if __name__ == "__main__":
  p = Player()

Работает, попробуйте правильно импортировать класс PhysicalObject.

...