2015-05-02 5 views
2

У меня проблемы с классами в минуту, и я не уверен, как решить мою проблему. Я читал документы, и я не могу подключить что-либо, сказанное там, с проблемой, с которой я сталкиваюсь.Передача класса другому классу (Python)

Я пытаюсь сделать несколько простых классов для игры. У меня есть класс Weapon и класс Person. Я пытаюсь передать класс Weapon to 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() 

Бег это дает мне:

Name: Bob 
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030> 

Продолжительность:

bob.ranged_attack(pistol, bob) 

Дает:

Weapon: Pistol 
Bob's Health: 60 

Мои вопросы, я передавая объект Weapon правильно к Класс человека? Кажется странным писать Weapon.ranged_weapon в _init__, а не self.ranged_weapon.

Как я могу заставить display_weapon_info показать строку «Weapon Name: Pistol», а не ссылку? Кажется, это работает, когда я называю это в ranged_attack, но не в информации о дисплее.

Действительно оцените любую помощь, которую я могу получить. Извините, если раньше задавался аналогичный вопрос, но я не мог найти ничего, что мог бы связать с моей проблемой.

Rich

ответ

3

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)) 
+0

Большое спасибо за помощь; Мне это удалось! – Rytchbass

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

Глядя на эту функцию, компилятор видит следующее:

Линия 1: Функция с именем display_person_info с параметром self.
Строка 2: Печать «Имя:», а затем напечатать название self
Строка 3: Печать «Оружие дальнего боя:», а затем Weapon.display_weapon_name.

В строке 3, вместо того, чтобы печатать название оружия, он печатает функцию display_weapon_name! Что вам нужно сделать, вместо этого заменить линию 3 с этим:

print('Ranged Weapon :%s' %self.weapon.display_weapon_name()) 

Таким образом, значение, возвращаемое функцией печатается, а не указатель функции.

+0

Спасибо, ваша информация о том, как вызвать функцию, очень полезна! – Rytchbass