2014-09-20 158 views
0

所以我最近對類的繼承有了一個瞭解,並開始意識到它們的用途。於是我開始爲自己編寫一個具體的例子。具有類繼承性的Python元類

我意識到,當我爲不同的武器製作多個類時,如果我有一個爲我生成這些類的類,會更容易。我有點卡在如何完成這件事。

我有搜索,它變得混亂和理論快速。這個網站上的例子(http://en.wikibooks.org/wiki/Python_Programming/Metaclasses)在「Class Factories」下似乎是我需要的,但我似乎錯過了一些東西。

這是我有:

class item(object): 
    def __init__(self, item_name, item_type): 
     self.item_type = item_type 
     self.item_name = item_name 

    def get_item_name(self): 
     return self.item_name 

    def get_item_type(self): 
     return self.item_type 

    def __str0__(self): 
     return "%s is a %s" % (self.item_name, self.item_type) 

class weapon(item): 
    def __init__(self, name, weapon_type, dmg_mod, atk_typ): 
     item.__init__(self, name, "weapon") 
     self.name = name 
     self.weapon_type = weapon_type 
     self.dmg_mod = dmg_mod 
     self.atk_typ = atk_typ 

    def get_wpn_type(self): 
     return self.weapon_type 

    def get_dmg_mod(self): 
     return self.dmg_mod 

    def get_atk_typ(self): 
     return atk_typ 

    def __str1__(self): 
     return "%s is a %s with %s type damage at a %i modifier" % (self.name, 
                    self.weapon_type, 
                    self.atk_typ, 
                    self.dmg_mod) 

def weapon_fact(weptype, dmg_type): 
    class weptype(weapon): 
     def __init__(self, name, dmg_mod): 
      weapon.__init__(self, name, weptype, dmg_mod, dam_type) 
      self.name = name 

當我做

longbow = weapon_fact("Long Bow", "Pierce") 
huntersbow = longbow("Hunter's Bow", 5) 

我得到這個回溯

Traceback (most recent call last): 
    File "<pyshell#1>", line 1, in <module> 
    huntersbow = longbow("Hunter's Bow", 5) 
TypeError: 'NoneType' object is not callable 

,當我嘗試打電話給長弓已經沒有分配給它。

回答

0

您的weapon_fact不會返回任何內容,因此將返回默認的None

您也想避免掩蓋weptype名稱:

def weapon_fact(weptype, dmg_type): 
    class SpecificWeapon(weapon): 
     def __init__(self, name, dmg_mod): 
      weapon.__init__(self, name, weptype, dmg_mod, dam_type) 
      self.name = name 
    return SpecificWeapon