首页 > 解决方案 > 制作名称中带有变量的类对象,不起作用

问题描述

x = 60
y = 300
platform_name = "Platform"
platform_parts = 1
%s.Platform(x,y, "edge_left") % platform_name+"_"+str(platform_parts)

这应该从我的 Platform 类创建一个名为 Platform_1 的平台,但它给出了一个语法错误,指向该%s部分。有谁知道我在这里做错了什么以及应该怎么做?

标签: pythonpython-3.x

解决方案


您可以使用type内置函数创建具有变量名的类对象。

>>> class Foo: pass  # Normal class declaration.

>>> Foo  # See how it's printed.
<class '__main__.Foo'>
>>> Foo_1 = Foo()  # Instantiation and assignment.
>>> Foo_1
<__main__.Foo object at 0x0000029B7FF5A240>
>>> name = 'Bar'  # Name in a string variable.
>>> globals()[name] = type(name, (), {})  # Dynamic class name from variable.
>>> Bar
<class '__main__.Bar'>
>>> Bar()
<__main__.Bar object at 0x0000029B7FF5AA90>

您还可以使用exec. 使用exec通常不受欢迎,因为几乎总是有更好的方法,但初学者通常不知道如何使用。但这种技术甚至被用于标准库中,例如namedtuple.

>>> name = 'Baz'
>>> codestring = f'''
class {name}: pass
'''
>>> codestring
'\nclass Baz: pass\n'
>>> print(codestring)

class Baz: pass

>>> exec(codestring, globals())
>>> Baz
<class '__main__.Baz'>

推荐阅读