-4

由于某种原因,该class变量self不能在 a 中定义function

功能:

def pickapoo_specialattack(opponent):
    print("PICKAPOO's FLATULENCE BOLTS WAS EFFECTIVE")
    self.damage -= float(self.damage / 20)
    damage_dealt = random.randrange(200, 250)
    defender.health -= damage_dealt
    print("\nPICKAPOO's DAMAGE RATING WAS DECREASED BY 20%")
    print("PICKAPOO's DAMAGE RATING IS NOW {}".format(str(self.damage)))
    return self.damage

班级:

class Deskemon(object):
    def __init__(self, name, health, damage, defense):

        self.base_name = name
        self.base_health = health
        self.base_damage = damage
        self.base_defense = defense

        self.name = self.base_name
        self.health = self.base_health
        self.damage = self.base_damage
        self.defense = self.base_defense

追溯:

Traceback (most recent call last):
  File "DESKEMON PRE ALPHA.py", line 378, in <module>
    Battle(deskemon, Jack)
  File "DESKEMON PRE ALPHA.py", line 168, in Battle
    Deskemon_Attack(D1, D2, special=(random.randrange(1, 100) <= 45))            
  File "DESKEMON PRE ALPHA.py", line 216, in Deskemon_Attack
    pickapoo_specialattack(defender)
  File "DESKEMON PRE ALPHA.py", line 115, in pickapoo_specialattack
    self.damage -= float(self.damage / 20)
NameError: name 'self' is not defined

这是我的完整代码: http: //pastebin.com/8Xn6UCKS

4

1 回答 1

2

那是因为self变量必须明确地赋予python中的方法。在您编写它时,您是否希望 python 读懂您的想法,因此它猜测self应该是与您的函数完全不相关的类中的某些东西?

因此,要绑定它,您需要:

  1. 添加self到参数列表def pickapoo_specialattack(self, opponent)
  2. 搬进pickapoo_specialattack(opponent)你的Deskemon班级

进一步查看您的代码,您所做的绝对是错误的,因为您正在破坏 OOP 的全部目的!使用类和子类来做你的目标。

让我给你一个不完整的例子来说明我的意思:

class Deskemon(object):
    def specialattack(self, opponent):
        raise NotImplementedError

    …

class Pickapoo(Deskemon):
    def specialattack(self, opponent):
         … # content of the pickapoo_specialattak() function

class Tamosha(Deskemon):
    def specialattack(opponent):
         … # content of the tamosha_specialattak() function

接着:

def main():
    pickapoo = Pickapoo(…)
    tamosha = Tamosha(…)

而不是猴子修补 Deskemon实例,使用正确的 OOP 概念并使 Deskemon 成为所有实例的基类。然后为每个Deskemon对象创建一个专门的实例,这就是你初始化的东西。

NB1:您应该在 main 函数中初始化所有对象:

NB2:您应该将所有代码放在 main 函数的末尾:

def main():
    # init
    pickapoo = Pickapoo(…)
    tamosha = Tamosha(…)
    lilwilly = Lilwilly(…)
    bigbboy = Biggboy(…)

    # start up
    print("Welcome to Deskemon Pre-Alpha V1.2".upper())
    …

    # play loop
    while True:
        deskemon_selection_menu()
        deskemon_selection_input = input("> ")
        if deskemon_selection_input == "1":
            deskemon = tamosha
        elif deskemon_selection_input == "2":
            deskemon = pickapoo
        elif deskemon_selection_input == "3":
            deskemon = lilwilly
        elif deskemon_selection_input == "4":
            deskemon = biggboi
        else:
            continue
        print("You have selected {} as your Deskemon".upper().format(deskemon))
        break

    # shut down
    print("Professor Andrew: Alright Jack, it's time to pick your Deskemon.")
    …
    print("Jack: OI! " + name + "!")
    time.sleep(1)

    Battle(deskemon, Jack)

if __name__ == "__main__":
    main()
于 2014-05-08T16:16:26.190 回答