Python:None类型对象不可调用

Python:None类型对象不可调用,python,pygame,Python,Pygame,我在pygame中做一个游戏,我想做的是让一个实体以另一个实体为目标。 当我调用目标函数时,我得到了“TypeError:NoneType对象不可调用”,我在研究了这个错误后理解为,当您尝试使用一个没有任何类型的函数的返回值时,它会发生。 但是,我的函数不应该返回一些东西,我也不使用返回值,所以我有点不知所措。 我希望有人能帮助我,这是我的代码: 目标函数 def target(self,x,y): target = self.world.getPointEntity(x,y)

我在pygame中做一个游戏,我想做的是让一个实体以另一个实体为目标。 当我调用目标函数时,我得到了“TypeError:NoneType对象不可调用”,我在研究了这个错误后理解为,当您尝试使用一个没有任何类型的函数的返回值时,它会发生。 但是,我的函数不应该返回一些东西,我也不使用返回值,所以我有点不知所措。 我希望有人能帮助我,这是我的代码: 目标函数

def target(self,x,y):
    target = self.world.getPointEntity(x,y)  
    if target != None and target.get_itarget():
        self.set_target(target)
self.player.target(x,y)
对目标函数的调用

def target(self,x,y):
    target = self.world.getPointEntity(x,y)  
    if target != None and target.get_itarget():
        self.set_target(target)
self.player.target(x,y)
如果您有任何问题,请随时提问

编辑:getPointEntity函数的代码:

    def getPointEntity(self, x, y, searchRange=24):
        for entity in self.entities.itervalues():
            if entity != None:
                distance = entity.get_distance(x, y)
                if distance < searchRange:
                    return entity
        return None   

通过将目标实体的检查放在目标函数之外,我解决了这个问题。我真的看不出有什么不同,但它似乎起作用了

LivingEntity
类中,您有一个名为
target
的方法,并且
LivingEntity
类中的代码用于引用该
LivingEntity.target
方法的语法是
self.target
。但是在
LivingEntity.set\u target
方法中,您使用
self.target=target
赋值覆盖
self.target

在该赋值之后,下次调用
target
方法时,Python尝试使用
set\u target
设置的
self.target
进行调用,而不是调用您期望它使用的
LivingEntity.target
方法


因此,您收到了错误消息,因为您告诉
set\u target
self.target
设置为
None

,正如PM 2Ring指出的那样,
set\u target
livingengentity.target
字段覆盖它所得到的内容。但问题甚至在这之前就开始了:
\uuu init\uu
方法会在任何人有机会调用它之前销毁
target
方法

下面是一个简单的例子:

#/usr/bin/env蟒蛇3
类InitDestroysMethod(对象):
定义初始化(自):
self.target=None
返回
def目标(自我):
return“这是InitDestroysMethod.target方法。”
def main():
打印(“使用uuu init_uuuuuuuuuu和目标方法:”)的类)
打印(“InitDestroysMethod.target:,end=”“)
打印(InitDestroysMethod.target)
打印(“InitDestroysMethod.target():”,end=“”)
print(InitDestroysMethod.target(None))#伪“自我”参数。
打印()
打印(“使用uuu init_uuuuuuuuuuu和目标方法的实例:”)
打印(“InitDestroysMethod().target:,end=”“)
打印(InitDestroysMethod().target)
打印(“InitDestroysMethod().target():”,end=“”)
打印(InitDestroysMethod().target())
返回
如果“\uuuu main\uuuuuu”==\uuuuuuuu name\uuuuuuu:
main()
以下是该程序的输出:

使用uuu init_uuuu和目标方法初始化:
InitDestroysMethod.target:
InitDestroysMethod.target():这是InitDestroysMethod.target方法。
使用_init__和目标方法的实例:
InitDestroysMethod()。目标:无
InitDestroysMethod()
文件“/init_vs_method.py”,第30行,在
main()
文件“/init_vs_method.py”,第25行,主目录
打印(InitDestroysMethod().target())
TypeError:“非类型”对象不可调用
如您所见,未实例化的类确实有一个
target
方法(技术上只是一个函数——当对象被实例化时,它将有一个绑定到对象的
self
参数的绑定方法)。只要为
self
参数提供参数,就可以像调用任何其他函数一样调用它。(这个技巧只在这种情况下有效,因为
target
实际上没有使用它的
self
参数,但它让我证明有一个名为
target
的可调用函数)

但是该类的一个实例已经受到
\uuuu init\uuuu
的影响。在这种情况下,
\uuuuu init\uuuu
将实例字典中的
target
的值设置为
None
target
的旧值是一个绑定方法,但当您获得对新创建和初始化对象的引用时,旧值早已被丢弃

当您使用类似于
some_instance.target
的字段时,将在实例字典中开始搜索名为“target”的实体。该字典确实有一个名为“target”的键。该类有一个名为“target”的函数没有什么区别——名称已经找到,并且它的值(
None
)被使用


然后你试着调用
None
值,就好像它是一个函数或一个方法一样,你会得到一个
TypeError

我编辑了你代码的缩进。请仔细检查它是否正确。在您的问题中包含完整的错误。请说明错误发生的确切行fwiw,使用
target
作为局部变量的名称以及方法名称是合法的Python,但阅读您的代码的人会感到困惑。我从一个答案开始,然后看到@PM2Ring注意到了什么,所以我以为我看到的错误不是。我已经删除了答案,并用另一个替换。但是绝对不要用同一个名字来表示函数和变量。很好,凯文!我不知道我怎么会错过那一行。。。也许在花了这么多时间等待阿纳凯发布必要的细节之后,我的大脑有点累了