首页 > 解决方案 > 'int' 对象没有属性 - 通过 __call__ 传递给类中的方法

问题描述

这是什么:一个类用于控制 NPC 和玩家的游戏角色统计和交互。

添加了调用方法以创建新的“生物类型”,可以根据玩家级别控制其统计缩放。

我正在尝试使用 Mob.wyvern(player_level) 方法来创建一个“Wyvern”类型的 NPC。在这种情况下,代码会成功运行,直到我们尝试使用 self.playerlevel 调用修改 a_wyvern.life。

错误:

Traceback (most recent call last):
  File "c:\Users\User\mystuff\Classes Game\Characters.py", line 74, in <module>
    a_wyvern = Mobs.wyvern(player_level)
  File "c:\Users\User\mystuff\Classes Game\Characters.py", line 36, in wyvern
    a_wyvern.life += a_wyvern.player_level
AttributeError: 'Mobs' object has no attribute 'player_level'
#Initializer, passing variables to all 
class Mobs():
    def __init__(self):
        self.life = 10
        self.atk = 2
        self.arm = 1
        self.name = villains.gen()
        self.playername = heroes.gen()
        self.type = type
            
    def __call__(self, player_level):
        self.player_level = player_level
        pass

    def attack(self, enemy):
        damage_amount = enemy.take_damage(self.atk)
        return damage_amount

    def take_damage(self, amount):
        damage_amount = (amount - self.arm)
        self.life -= damage_amount
        return damage_amount

    
    def wyvern(self):
        a_wyvern = Mobs()
        a_wyvern.type = "Wyvern"
        a_wyvern.life += self.player_level
        return a_wyvern
player_level = 20

a_wyvern = Mobs.wyvern(player_level)
a_wyvern.type
a_wyvern.life
a_wyvern.atk

print(a_wyvern.life)
print(a_wyvern.atk)
print(a_wyvern.name)

标签: pythoncall

解决方案


据我所知,您对通话有错误的想法。创建类的实例后,将在__call__运行时像函数一样调用该实例。例子:

>>> class A:
    def __init__(self, A):
        print('A', A)
        
    def __call__(self, B):
        print('B', B)

        
>>> a = A(5)
A 5
>>> a(4)
B 4

呼叫永远不会在您的场景中实际运行。相反,您绕过__init__and__call__来运行一个单独的初始化函数wyvern.

这里的问题是两件事之一。首先, call 永远不会运行,尽管它对's的执行至关重要。wyvern其次,您将一个整数传递给wyvern. self是一个函数变量,它会自动被运行每个函数的类的实例替换。整数是一个不同的类,它没有一个名为 的内部变量player_level

总而言之,你的类初始化搞砸了,这给你带来了一堆错误


推荐阅读