Python:使用用户输入作为类名的类工厂
我想动态地将类属性添加到超类。此外,我想创建动态继承自该超类的类,并且这些子类的名称应取决于用户输入。
有一个超类“Unit”,我可以在运行时向其添加属性。这已经有效了。
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
myarcher的强度:2
但现在我不想预定义Archer这个子类,但我宁愿让用户决定如何调用这个子类。我尝试过这样的事情:
class Meta(type, subclassname):
def __new__(cls, subclassname, bases, dct):
return type.__new__(cls, subclassname, Unit, dct)
factory = Meta()
factory.__new__("Soldier")
但没有运气。我想我还没有真正理解 new 在这里做什么。 我想要的结果是
class Soldier(Unit):
pass
由工厂创建的。如果我用参数“Knight”来调用工厂,我希望创建一个 Knight 类,它是 Unit 的子类。
有什么想法吗?非常感谢!
再见
-佐野
I want to add class atttributes to a superclass dynamically. Furthermore, I want to create classes that inherit from this superclass dynamically, and the name of those subclasses should depend on user input.
There is a superclass "Unit", to which I can add attributes at runtime. This already works.
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)
This leads to the desired output:
Strenght ofmyarcher: 5
Strenght ofmyarcher: 2
But now I don't want to predefine the subclass Archer, but I'd rather let the user decide how to call this subclass. I've tried something like this:
class Meta(type, subclassname):
def __new__(cls, subclassname, bases, dct):
return type.__new__(cls, subclassname, Unit, dct)
factory = Meta()
factory.__new__("Soldier")
but no luck. I guess I haven't really understood what new does here.
What I want as a result here is
class Soldier(Unit):
pass
being created by the factory. And if I call the factory with the argument "Knight", I'd like a class Knight, subclass of Unit, to be created.
Any ideas? Many thanks in advance!
Bye
-Sano
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
要从名称创建类,请使用
class
语句并指定名称。观察:现在我想我应该解释一下自己,等等。当您使用 class 语句创建类时,它是动态完成的 - 相当于调用
类型()
。例如,以下两个片段执行相同的操作:
类的名称(类型的第一个参数)被分配给
__name__
,这基本上就结束了(唯一一次 < code>__name__ 本身可能在默认的__repr__()
实现中使用)。要创建具有动态名称的类,您实际上可以像这样调用 type ,或者您可以稍后更改类名称。不过,class
语法的存在是有原因的——它很方便,而且以后很容易添加和更改内容。例如,如果你想添加方法,那就是等等。因此,我建议使用 class 语句——如果您从一开始就知道可以这样做,那么您可能会这样做。处理
type
等等是一团糟。(顺便说一句,您不应该手动调用
type.__new__()
,而只能调用type()
)To create a class from a name, use the
class
statement and assign the name. Observe:Now I suppose I should explain myself, and so on. When you create a class using the class statement, it is done dynamically-- it is equivalent of calling
type()
.For example, the following two snippets do the same thing:
The name of a class-- the first argument to type-- is assigned to
__name__
, and that's basically the end of that (the only time__name__
is itself used is probably in the default__repr__()
implementation). To create a class with a dynamic name, you can in fact call type like so, or you can just change the class name afterward. Theclass
syntax exists for a reason, though-- it's convenient, and it's easy to add to and change things later. If you wanted to add methods, for example, it would beand so on. So I would advise using the class statement-- if you had known you could do so from the beginning, you likely would have done so. Dealing with
type
and so on is a mess.(You should not, by the way, call
type.__new__()
by hand, onlytype()
)查看
type()
内置函数。但就您而言,如果子类没有实现不同的行为,也许为
Unit
类提供name
属性就足够了。Have a look at the
type()
builtin function.But in your case, if the subclasses don't implement a different behaviour, maybe giving the
Unit
class aname
attribute is sufficient.