我想动态地将类atttributes添加到超类中。此外,我想创建动态继承自这个超类的类,这些子类的名称应该取决于用户输入。
有一个超类“单元”,我可以在运行时添加属性。这已经有效了。
def add_attr (cls, name, value):
setattr(cls, name, value)
class Unit(object):
pass
class Archer(Unit):
pass
myArcher = Archer()
add_attr(Unit, 'strength', 5)
print "Strenght ofmyarcher: " + str(myArcher.strength)
Unit.strength = 2
print "Strenght ofmyarcher: " + str(myArcher.strength)
这导致所需的输出:
心理学家:5
心理学家:2
但是现在我不想预定义子类Archer,但我宁愿让用户决定如何调用这个子类。我尝试过这样的事情:
class Meta(type, subclassname):
def __new__(cls, subclassname, bases, dct):
return type.__new__(cls, subclassname, Unit, dct)
factory = Meta()
factory.__new__("Soldier")
但没有运气。我想我还没有真正理解新在这里做什么。 我想要的结果是
class Soldier(Unit):
pass
由工厂创建。如果我用“Knight”这个参数调用工厂,我想要创建一个类Knight,Unit的子类。
有什么想法吗?非常感谢提前!
再见
-Sano
答案 0 :(得分:14)
要从名称创建类,请使用class
语句并指定名称。观察:
def meta(name):
class cls(Unit):
pass
cls.__name__ = name
return cls
现在我想我应该解释自己,等等。使用class语句创建类时,它是动态完成的 - 它相当于调用type()
。
例如,以下两个代码段执行相同的操作:
class X(object): pass
X = type("X", (object,), {})
类的名称 - 类型的第一个参数 - 被分配给__name__
,这基本上就是它的结束(唯一一次__name__
本身使用的可能是默认值__repr__()
实施)。要创建一个具有动态名称的类,您实际上可以像这样调用类型,或者您可以稍后更改类名。 class
语法存在是有原因的,但它很方便,以后很容易添加和更改。例如,如果你想添加方法,那就是
class X(object):
def foo(self): print "foo"
def foo(self): print "foo"
X = type("X", (object,), {'foo':foo})
等等。所以我建议使用类声明 - 如果你知道你可以从一开始就这样做,你可能会这样做。处理type
等等是一团糟。
(顺便说一句,你不应该手动拨打type.__new__()
,type()
)
答案 1 :(得分:7)
查看type()
内置函数。
knight_class = type('Knight', (Unit,), {})
但是在你的情况下,如果子类没有实现不同的行为,可能给Unit
类一个name
属性就足够了。