蟒蛇:类工厂使用的用户输入作为类名称
-
20-09-2019 - |
题
我想添加类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
属性是足够的。