我有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
我已经进行了一些故障排除和编辑,但不确定性很大。
答案 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 )。