【问题标题】:Can you generate new self names inside a class?你能在一个类中生成新的名字吗?
【发布时间】:2019-06-12 14:42:47
【问题描述】:

试图弄清楚如何使用函数在类中生成新的自命名变量。

我在 IDLE 中玩过它,并搜索了在线文档。解决方案在暗示我。

>>> import random

>>> abc = [(map(chr,range(ord('A'),ord('Z')+1)))+(map(chr,range(ord('a'),ord('z')+1)))]

>>> class Test():
        def __init__(self, abc):
            self.a = 0
            self.abc = abc

        def newSelf(self):
            for i in range(2):
                b = random.choice(abc)
                c = random.choice(abc)
                globals()['self.'+b+c] = 0
                #or
                locals()['self.'+b+c] = 0
                print(b+c,0)

>>> example = Test(abc)
>>> example.a
0
>>> example.newSelf() #say it generates
An 0
ze 0
>>> example.An #calling new self variable of example object returns

Traceback (most recent call last):
  File "<pyshell#221>", line 1, in <module>
    example.An
AttributeError: 'Test' object has no attribute 'An'

# I'm hoping for...
>>> example.An
0

【问题讨论】:

  • 为什么不使用字典来存储Anze(以及任何其他任意生成的字符对)?
  • 在调用类方法时尝试动态生成新的自我身份,我认为这将有助于使用 pygame 进行图像处理。最终,我试图分解我的批量精灵图像。随着被分解成更小的图像,一些图像在 20-30 范围内,而另一些则为 100+ 每个大图像。我想尝试动态生成名称以使其更具适应性,同时将新名称添加到列表中,以便在对象的调用系统中写入引用。

标签: python-3.x class attributes local-variables globals


【解决方案1】:

使用setattr

您可以使用setattr设置新属性:

>>> class Test():
...     def __init__(self, abc):
...         self.a = 0
...         self.abc = abc
...     def newSelf(self):
...         for i in range(2):
...             b = random.choice(abc)
...             c = random.choice(abc)
...             setattr(self, b+c, 0)
...             print(b+c,0)

并且该属性将再次可用:

>>> example = Test(abc)
>>> example.newSelf()
zM 0
Ja 0
>>> example.zM
0
>>> example.Ja
0

使用exec

您可以使用exec 函数来执行存储在字符串中的python 语句。由于您正在随机生成变量名称,您可以在字符串中创建整个 python 语句,并使用exec 执行该语句,如下所示:

>>> class Test():
...     def __init__(self, abc):
...         self.a = 0
...         self.abc = abc
...     def newSelf(self):
...         for i in range(2):
...             b = random.choice(abc)
...             c = random.choice(abc)
...             exec('self.'+b+c+' = 0')
...             print(b+c,0)

在这里,我使用exec('self.'+b+c+' = 0') 创建了新属性。现在,调用此方法后,该属性将可用:

>>> example = Test(abc)
>>> example.newSelf()
Tw 0
Xt 0
>>> example.Tw
0
>>> example.Xt
0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-30
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 2017-09-01
    相关资源
    最近更新 更多