Наследование декораторов - PullRequest
0 голосов
/ 30 июня 2019

У меня есть 3 файла: один person.py и items.py и game.py.

В game.py есть обработчик событий, такой, что при нажатии кнопки или пробела он вызывает объект игрока, чтобы использовать функцию, данную ему объектом в его руке.

Для этого я создал наследуемый класс элементов с функцией, которая при вызове человеком возвращает функцию, специфичную для подкласса элемента.

Я попытался создать функцию декоратора элемента @efunc, которая устанавливает функцию ниже как переменную self.efunc и вторую функцию, которая будет вызываться человеком inhand.getefunc(), который возвращает efunc как переменную, которая затем вызывается человеком, когда game.py вызывает эту функцию.

В person.py:

class person:
  def init(self):

    self.inhand = banana # this could be many other different items and
    #changes through the game

  def useefunc(self): # game.py calls this function when e is pressed
    func = self.inhand.getefunc()
    func(self)

  def usespacefunc(self):# game.py calls this function when space is #pressed
    func = self.inhand.getspacefunc()
    func(self)

В items.py:

class items:
  def init(self):
    self.efunc
    self.spacefunc

  def efunc(func,self):
    self.efunc = func

  def getefunc(self)
    return self.efunc

  def spacefunc(func,self):
    self.spacefunc = func

  def getspacefunc(self):
    return self.spacefunc

class banana(items):

  def init(self):# was removed
    self.efunc = consume # I tried this it did not work was removed
    self.spacefunc = trash # also did not work was removed
  @spacefunc
  def consume (p):

#p is a person so consume can transfer its effects on the person and its animation
 @efunc
  def trash(p):

class nothing(items):
  pass

Я выполнил некоторые действия по устранению неполадок и редактированию, и я не мог определить многое.

1 Ответ

1 голос
/ 30 июня 2019

Я думаю, вы делаете вещи намного сложнее, чем они должны быть.Для объекта Person было бы намного проще передать ссылку на соответствующий метод элемента в его руке.

class Person:
    def __init__(self, in_hand):
        self.in_hand = in_hand

    def use_object(self):
        self.inhand.use(self)

class Item:
    def use(self, person):
        pass

class Banana(Item):
    def use(self, person):
        # do something here?

Нет необходимости в декораторах или любой другой сложности.

Что касается того, почему ваш код не работал, основной проблемой было то, что вы пытались использовать self в контексте, где еще не было экземпляра.Например, декоратор метода не может напрямую использовать self, поскольку метод определен до того, как класс еще существует (и long до того, как будут созданы какие-либо экземпляры).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...