Inheritance 具有类继承的Python元类

Inheritance 具有类继承的Python元类,inheritance,python-3.x,metaclass,Inheritance,Python 3.x,Metaclass,所以我最近对类的继承有了一个理解,并开始欣赏它们的用途。所以我开始为自己编写一个具体的例子 我意识到,当我为不同的武器制作多个类时,如果我能有一个类为我生成这些类,那就更容易了。我有点纠结于如何完成这件事 我四处搜索,很快就会变得混乱和理论化。这个例子在这个网站下的类工厂似乎是我需要的,但我似乎遗漏了一些东西 以下是我所拥有的: class item(object): def __init__(self, item_name, item_type): self.item_

所以我最近对类的继承有了一个理解,并开始欣赏它们的用途。所以我开始为自己编写一个具体的例子

我意识到,当我为不同的武器制作多个类时,如果我能有一个类为我生成这些类,那就更容易了。我有点纠结于如何完成这件事

我四处搜索,很快就会变得混乱和理论化。这个例子在这个网站下的类工厂似乎是我需要的,但我似乎遗漏了一些东西

以下是我所拥有的:

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
当我尝试调用longbow时,它没有被分配任何属性。

您的武器事实没有返回任何内容,因此默认值为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