2014-09-20 2 views
0

그래서 최근에는 클래스에 대한 상속에 대한 이해를 얻었으며 사용법을 이해하게되었습니다. 그래서 나는 나 자신을 위해 구체적인 예를 코딩하기 시작했다.클래스 상속을 사용하는 파이썬 메타 클래스

다른 무기에 대해 여러 클래스를 만들면서 나는이 클래스를 생성 한 클래스를 가질 수 있다는 것을 깨달았습니다. 이 일을 처리하는 방법에 조금 얽혀 있습니다.

나는 주위를 검색하고 혼란스럽고 이론적으로 빠릅니다. "Class Factories"아래에있는이 사이트 (http://en.wikibooks.org/wiki/Python_Programming/Metaclasses)의 예제는 내가 필요한 것처럼 보이지만 나는 뭔가 빠져있는 것처럼 보입니다. 여기

내가 가진 무엇 :

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이 반환됩니다.

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 
:

또한 weptype 이름을 마스킹 피하려고

관련 문제