gpt4 book ai didi

Python:使用用户输入作为类名的类工厂

转载 作者:太空狗 更新时间:2023-10-29 17:57:37 25 4
gpt4 key购买 nike

我想动态地向父类(super class)添加类属性。此外,我想创建动态继承自该父类(super class)的类,并且这些子类的名称应取决于用户输入。

有一个父类(super class)“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
我的弓箭手的力量: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 的子类。

有什么想法吗?非常感谢!
再见
-佐野

最佳答案

要根据名称创建类,请使用 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__是它自己used 可能在默认的 __repr__() 实现中)。要创建一个具有动态名称的类,您实际上可以像这样调用类型,或者您可以在之后更改类名。 class 语法的存在是有原因的——它很方便,而且以后添加和更改内容也很容易。例如,如果你想添加方法,那就是

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

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

等等。所以我建议使用 class 语句——如果你从一开始就知道你可以这样做,你很可能会这样做。处理 type 等等是一团糟。

(顺便说一下,您不应该手动调用 type.__new__(),只能调用 type())

关于Python:使用用户输入作为类名的类工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2461751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com