在学习跨类调用时遇到问题

跨类调用问题

class Player:
    def __init__(self,game_player):
        self.game_player = game_player
    def atk(self,game_enemy):
        self.game_enemy = game_enemy
        print(f"{self.game_player}使用{self.Enemy.game_skill}攻击了敌人")
        self.game_enemy.suffer_beating()
class Enemy:
    def __init__(self,game_skill):
        self.game_skill = game_skill
    # def __str__(self):
    #     return f"{self.}"
    def suffer_beating(self):
        print(f"{self.Play.game_enemy}受伤了,头顶爆字")
CJ = Player("321")
power = Enemy("123")
CJ.atk("xz")


跨类没有办法使用变量

报错:

Traceback (most recent call last):
  File "/home/tarena/month01/day11/homeworlk.py", line 26, in 
    CJ.atk("xz")
  File "/home/tarena/month01/day11/homeworlk.py", line 15, in atk
    print(f"{self.game_player}使用{self.Enemy.game_skill}攻击了敌人")
AttributeError: 'Player' object has no attribute 'Enemy'

我希望能正确输出我代码中两个print的内容

你这样是循环引用的,不建议用A引用B,B在引用A。想想在构造A对象的时候,B对象还没有建立,就初始化A对象这是不好的做法,尽管也有办法塞入进去,但Python采用的是引用计数法对内存进行回收的,这样的内存会导致内存泄漏的产生。如下代码改成:

class Enemy:
    def __init__(self, game_skill):
        self.game_skill = game_skill

    def suffer_beating(self):
        print(f"{self.game_skill}受伤了,头顶爆字")


class Player:
    def __init__(self, game_player, enemy: Enemy):
        self.game_player = game_player
        self.Enemy = enemy

    def atk(self):
        print(f"{self.game_player}使用{self.Enemy.game_skill}攻击了敌人")
        self.Enemy.suffer_beating()


power = Enemy("123")
CJ = Player("321", power)
CJ.atk()


这段代码有一些错误,我来解释一下:

在 Player 类的 atk 方法中,self.game_enemy 是一个字符串,但 suffer_beating() 方法需要传入一个 Enemy 类型的实例。因此,需要将 self.game_enemy 的类型更改为 Enemy 类型。
在 Player 类的 atk 方法中,打印语句使用了 self.Enemy.game_skill,但实际上应该使用 self.game_enemy.game_skill,因为 game_enemy 是该方法的参数,而不是类属性。
在 Enemy 类的 suffer_beating 方法中,打印语句中使用了 self.Play.game_enemy,但实际上应该使用 self,因为 suffer_beating 方法中没有 Play 属性。
下面是修正后的代码:

class Player:
    def __init__(self, game_player):
        self.game_player = game_player

    def atk(self, game_enemy):
        self.game_enemy = game_enemy
        print(f"{self.game_player}使用{self.game_enemy.game_skill}攻击了敌人")
        self.game_enemy.suffer_beating()

class Enemy:
    def __init__(self, game_skill):
        self.game_skill = game_skill

    def suffer_beating(self):
        print(f"{self}受伤了,头顶爆字")

CJ = Player("321")
power = Enemy("123")
CJ.atk(power)


在上述代码中,我更正了 Player 类中的 atk 方法和 Enemy 类中的 suffer_beating 方法中的错误,并在最后调用了 CJ.atk(power) 来进行一次攻击。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632