2013-12-21 2 views
0

Вот очень короткий пример того, что я имею в виду.Переменные класса обмена

class class1(): 
    def method1(self): 
     self.variable1 = 5 
class class2(): 
    def method2(self): 
     self.variable2 = var1.variable1 * 2 
class class3(): 
    def __init__(self): 
     self.var1 = class1() 
     self.var2 = class2() 

instance = class3() 
instance.var1.variable1 = 10 
instance.var2.method2() 
print instance.var2.variable2 

приведенный выше код, очевидно, остановится во второй строке, потому что class2 не знает, что такое var1.

Теперь я знаю, что что-то подобное выполняется с подклассами, или просто поддерживая методы под одним классом. Но в моем случае я не думаю (я не говорю, что знаю, так как я не очень опытен, но я не думаю), что это приемлемое решение.

Вот bigger sample code (что я на самом деле работаю), и это еще не все, есть еще две (еще большие) системы, чем это мне нужно реализовать (навыки & перки). Поэтому, если бы я полагался на подклассы, у меня был бы один массивный класс, загруженный подклассами, а не со многими классами, объединенными позже в коде.

Каковы хорошие способы решения этой проблемы? Я просто делаю все это неправильно?

Edit/Update: Еще одно замечание, этот код будет повторно использоваться несколько раз за много различных переменных, а не только один (конечно.)

+0

Существует несколько способов решения этой проблемы. Тот, который я нахожу наиболее очевидным, состоит в том, чтобы не иметь 'class2' handle' method2'; переместите логику где-нибудь, которая знает о необходимых объектах, например 'class3'. – user2357112

+0

@ user2357112, как я уже сказал, я думаю, что это невозможно, но теперь, когда вы упомянули об этом, «цепочка» может работать, хотя это еще больше осложнит код. (например, объявляя переменную, которая использует класс1 в классе2, а затем использует класс2 и класс3 в классе4 и т. д. вместо того, чтобы пытаться объединить классы 1, 2 и 3 в классе 4, как я делаю сейчас) – Cestarian

ответ

1

Может быть что-то вроде этого:

class NotEnoughMagic(Exception): 
    pass 


class Character(object): 
    fire = 0 
    magic = 0 
    hp = 100 
    armor = 1 
    def take_damage(self, amount): 
     self.hp -= amount 
     if self.hp <= 0: 
      print '%s HAS DIED!' % type(self).__name__ 
    def walk(self): 
     pass 
    def attack(self, target, attack_points): 
     target.take_damage(attack_points/target.armor) 


class Monster(Character): 
    fire = 50 
    hp = 150 
    armor = 2 
    def punch(self, target): 
     self.attack(target, 25) 


class Magician(Character): 
    magic = 10 
    def magic_armor(self): 
     self.hp += 20 
     self.magic -= 10 
    def sword_attack(self, target): 
     self.attack(target, 20) 
    def magic_attack(self, target): 
     """Does tons of damage but uses all magic""" 
     if self.magic > 0: 
      self.attack(target, 100) 
      self.magic = 0 
     else: 
      raise NotEnoughMagic() 

Использование:

>>> monster  = Monster() 
>>> magician = Magician() 
>>> 
>>> print magician.hp 
100 
>>> print monster.hp 
150 
>>> 
>>> monster.punch(magician) 
>>> magician.sword_attack(monster) 
>>> 
>>> print magician.hp 
75 
>>> print monster.hp 
140 
>>> 
>>> monster.punch(magician) 
>>> magician.magic_attack(monster) 
>>> 
>>> print magician.hp 
50 
>>> print monster.hp 
90 
>>> 
>>> monster.punch(magician) 
>>> magician.magic_attack(monster) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 14, in magic_attack 
__main__.NotEnoughMagic 
>>> 
>>> print magician.hp 
25 
>>> print monster.hp 
90 
>>> 
>>> monster.punch(magician) 
Magician HAS DIED! 
>>> magician.sword_attack(monster) 
>>> 
>>> print magician.hp 
0 
>>> print monster.hp 
80 

Некоторые потенциал игры логика:

>>> # Gang of monsters 
... monsters = [Monster() for x in range(10)] 
>>> magician = Magician() 
>>> 
>>> # Prepare for battle 
... while magician.magic > 0: 
...  magician.magic_armor() 
...  
... # Put on some chain mail 
... magician.armor += 5 
    File "<stdin>", line 6 
    magician.armor += 5 
     ^
SyntaxError: invalid syntax 
>>> 
>>> 
>>> while magician.hp > 0: 
...  for m in monsters: 
...    m.punch(magician) 
... 
Magician HAS DIED! 
Magician HAS DIED! 
Magician HAS DIED! 
Magician HAS DIED! 
Magician HAS DIED! 
Magician HAS DIED! 
Magician HAS DIED! 
>>> 

Update:

Кроме того, одна вещь, чтобы отметить это mixins. Например, если вы хотите добавить дополнительные функции к широкому набору классов, но не по всему дереву наследования.

class TeleportAbilityMixin(object): 
    def teleport(self, destination): 
     cost = 20 
     if self.mp >= cost: 
      # Unpack the x, y coordinates 
      self.x, self.y = destination 
      self.mp -= cost 

class TeleportingMagician(Magician, TeleportAbilityMixin): 
    pass 

m = TeleportingMagician() 
new_location = (10, 5) 
m.teleport(new_location) 
+0

Хотя это не напрямую ответьте на мой вопрос, я думаю ... Это все еще очень полезно, и я многому научился у него. Благодаря! В любом случае, я действительно думаю, что ваша «целевая» система действительно отвечает на мой вопрос в основном, поэтому я принимаю это как ответ :) – Cestarian

+1

О, ну, на самом деле, на самом деле это было так, как вы создали класс «Персонаж», а затем продолжалось в ветвях с классами «Monster (Character)» и «Magician (Character)», так и было, что я решил продолжить мой код. Внес некоторые незначительные изменения, но я думаю, что теперь он выглядит намного лучше. Еще раз спасибо! – Cestarian

+0

Я видел, что ваш код имел различный подход от типичных объектно-ориентированных подходов, поэтому я хотел показать, как это можно сделать таким образом. Также имейте в виду, что вы также можете подклассифицировать «Маг» или «Монстр» так же, как вы подклассифицировали «Символ». Например: «класс Dragon (Monster)», а затем «класс Whelp (Dragon): ...» и уточняйте все дальше и дальше вниз. –

Смежные вопросы