将类传递给另一个类(Python)

Ryt*_*ass 6 python class

我在课堂上遇到一些麻烦,我不知道如何解决我的问题.我已经阅读了文档,我无法将那里所说的任何内容与我遇到的问题联系起来.

我正在尝试为游戏制作一些简单的课程.我有一个Weapon类和一个Person类.我正试图将武器传递给Person类(我希望这是有道理的),以便Person(Bob)可以使用武器.我在访问Weapon类中的方法和属性时遇到了问题.我已经考虑过让Person成为Weapon的子类,这样它就可以轻松地调用这个方法,但这对我来说似乎并不直观...

class Weapon:
    def __init__(self, weapon_name, weapon_damage):
        self.weapon_name = weapon_name
        self.weapon_damage = weapon_damage

    def display_weapon_name(self):
        print('Weapon Name: %s' %self.weapon_name)


class Person:

    def __init__(self, person_name, health, ranged_weapon):
        self.person_name = person_name
        self.health = health
        Weapon.ranged_weapon = ranged_weapon

    def display_person_info(self):
        print('Name: %s' %self.person_name)
        print('Ranged Weapon :%s' %Weapon.display_weapon_name)

def ranged_attack(self, ranged_weapon, target):
    target.health -=ranged_weapon.weapon_damage
    print("Weapon: %s" %ranged_weapon.weapon_name)
    print(target.person_name + "'s Health: "+str(target.health))

pistol = Weapon("Pistol", 40)
bob = Person("Bob", 100, pistol)

bob.display_person_info()
Run Code Online (Sandbox Code Playgroud)

运行这个给了我:

Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
Run Code Online (Sandbox Code Playgroud)

运行:

bob.ranged_attack(pistol, bob)
Run Code Online (Sandbox Code Playgroud)

得到:

Weapon: Pistol
Bob's Health: 60
Run Code Online (Sandbox Code Playgroud)

我的问题是,我是否正确地将Weapon对象传递给Person类?在_init__中编写Weapon.ranged_weapon而不是self.ranged_weapon似乎很奇怪.

如何让display_weapon_info显示字符串'Weapon Name:Pistol',而不是引用?当我在ranged_attack中调用它时,它似乎工作,但不在显示信息中.

真的很感激我能得到的任何帮助.如果以前曾问过类似的问题,我会道歉,但我找不到任何与我的问题有关的内容.

丰富

che*_*ner 7

Person实际上并不需要Weapon直接引用该类; 它只需要保存对作为ranged_weapon参数传递的任何内容的引用,并知道它可以对该对象做什么.代码隐含地假设它ranged_weapon是一个实例Weapon,但是可以使用任何与瞬间相似的对象Weapon.

class Person:

    def __init__(self, person_name, health, ranged_weapon):
        self.person_name = person_name
        self.health = health
        self.weapon = ranged_weapon

    def display_person_info(self):
        print('Name: %s' %self.person_name)
        # display_weapon_name already calls print; but
        # you probably don't need this method at all.
        self.weapon.display_weapon_name()
        # Instead, do this (actually, you already do this
        # in ranged_attack())
        # print('Weapon: %s' % self.weapon.weapon_name)


    def ranged_attack(self, ranged_weapon, target):
        target.health -= self.weapon.weapon_damage
        print("Weapon: %s" % self.weapon.weapon_name)
        print(target.person_name + "'s Health: "+str(target.health))
Run Code Online (Sandbox Code Playgroud)