装饰器的继承

时间:2019-06-29 22:50:40

标签: python function inheritance

我有3个文件,分别为person.pyitems.pygame.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 个答案:

答案 0 :(得分:1)

我认为您正在使事情变得复杂得多。 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 )。