【问题标题】:Making a class object with a variable in its name, not working制作名称中带有变量的类对象,不起作用
【发布时间】:2018-08-26 00:14:16
【问题描述】:
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 部分。有谁知道我在这里做错了什么以及应该怎么做?

【问题讨论】:

  • 不要这样做。改用容器,例如 dict
  • %s 用于字符串格式化
  • 你想创建一个子类吗?目前尚不清楚您的要求是什么。

标签: python python-3.x


【解决方案1】:

您可以使用 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'>

【讨论】:

    【解决方案2】:

    如果您只是想将实例分配给动态名称,

    globals()[platform_name+"_"+str(platform_parts)] = Platform(x,y, "edge_left")
    

    这将使名为 Platform_1 的全局变量具有 Platform 实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 2020-10-28
      • 1970-01-01
      相关资源
      最近更新 更多