我在课堂上遇到一些麻烦,我不知道如何解决我的问题.我已经阅读了文档,我无法将那里所说的任何内容与我遇到的问题联系起来.
我正在尝试为游戏制作一些简单的课程.我有一个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中调用它时,它似乎工作,但不在显示信息中.
真的很感激我能得到的任何帮助.如果以前曾问过类似的问题,我会道歉,但我找不到任何与我的问题有关的内容.
丰富
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)