2013-12-21 146 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(我實際上在做什麼),這不是全部,有2個其他(甚至更大)的系統比我需要實現(技能&特技)。所以如果我依賴於子類,我會有一個大型的類加載子類,而不是稍後在代碼中加入的許多類。

有什麼好方法可以解決這個問題?我只是做這一切都錯了嗎?

編輯/更新:另外要注意,這個代碼將被重新多次使用了很多不同的變量,而不是一個(當然)

+0

有許多的方式來解決這個問題。我發現最明顯的是沒有'class2'處理'method2';將邏輯移動到某個知道必要對象的地方,比如'class3'。 – user2357112

+0

@ user2357112像我說的,我「認爲」這是不可行的,但現在你提到它,「鏈接」它可能有效,儘管它會使代碼更加複雜。 (例如聲明一個變量,它在class2中使用class1,然後在class4中使用class2和class3,等等,而不是像我現在正在做的那樣嘗試合併class 4中的class 1,2和3) – 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! 
>>> 

更新:

此外,有一點需要注意的是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

哦沒關係,真正回答它是如何創建的「性格」類,然後繼續在「怪物(人物)」和「魔術師(人物)」課程的分支中,這就是我選擇繼續使用我的代碼的方式。進行了一些小修改,但我認爲現在看起來好多了。再次感謝! – Cestarian

+0

我看到你的代碼與典型的面向對象的方法有不同的方法,所以我想展示一下如何以這種方式做到這一點。另外,請記住,您也可以按照分類爲「Character」的方式來劃分「魔術師」或「怪物」。例如:「龍類(怪物)」,然後是「龍類(龍)」:......並從頂部進一步細化。 –