我想添加类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)

这导致所需产出:
力量ofmyarcher:5
力量ofmyarcher:2

但现在我不想预先定义的子类弓箭手,但我宁可让用户决定如何称呼这个子类。我已经试过了事情是这样的:

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

正在创建的工厂。如果我打电话给工厂的说法"骑士",我喜欢的类骑士的子类的单元,以创建。

任何想法?许多在此先感谢!
再见了
-Sano

有帮助吗?

解决方案

要来自名称创建一个类,使用class语句和分配的名称。观察:

def meta(name):
    class cls(Unit):
        pass

    cls.__name__ = name
    return cls

现在,我想我应该解释一下,等等。当您使用类的语句创建一个类,它是做dynamically--它相当于调用type()

例如,下面的两个片段做同样的事情:

class X(object): pass
X = type("X", (object,), {})

一个分类 - 的第一个参数类型 - 的名称被分配给__name__,这就是基本上的,所述端(唯一的时间__name__本身被可能是在默认__repr__()实现)。要创建一个类与动态的名字,你其实可以呼叫类型,像这样,或者你可以改变类名之后。该class语法存在是有原因的,though--很方便,而且很容易添加到后来改变的事情。如果你想添加的方法,例如,这将是

class X(object):
    def foo(self): print "foo"

def foo(self): print "foo"
X = type("X", (object,), {'foo':foo})

等。所以,我会建议使用类statement--如果你已经知道你可以从一开始就这样做,你可能早就这样做了。与type处理等是一片混乱。

(你不应该,顺便说一下,通过用手拨打type.__new__(),仅type()

其他提示

看看 type() 系统的功能。

knight_class = type('Knight', (Unit,), {})
  • 第一个参数:名称的新的类
  • 第二个参数:Tuple的父母的课程
  • 第三个参数:词典的类属性。

但在你的情况下,如果该子类别实行不同的行为,可能给予的 Unit a类 name 属性是足够的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top