<p>正如<a href="https://stackoverflow.com/a/27161291/908494">b4hand</a>指出的,<code>__name__</code>是<em>类型</em>的名称,这显然不是您想要的。对象不知道分配给它们的变量的名称。如果你想一想,他们怎么可能?同一个对象可以分配给20个不同的变量,或者没有(可能它唯一存在的地方是作为一个集合的成员)。你知道吗</p>
<p>将代码传递到<code>_Language</code>构造函数(如<a href="https://stackoverflow.com/a/27161293/908494">kindall's answer</a>)显然是最干净的解决方案……但它需要一些重复。除了单调乏味之外,它还带来了出错的机会,以及最难调试的愚蠢的打字错误。你知道吗</p>
<p>那么,我们有办法解决这个问题吗?当然。施工后只需添加代码:</p>
<pre><code>class _Language:
def __init__(self, name, bRightToLeft=False):
self.name = name
self.bRightToLeft = bRightToLeft
def isRightToLeft(self):
return self.bRightToLeft
def getName(self):
return self.name
def __str__(self):
return self.code
class Language:
EN = _Language("English")
AF = _Language("Afrikaans")
SQ = _Language("Albanian")
for code, language in inspect.getmembers(Language):
if code.isalpha() and code.isupper():
language.code = code
</code></pre>
<hr/>
<p>但是,当我们这样做的时候,我们也可以省去所有重复的<code>_Language</code>:</p>
<pre><code>class Language:
EN = "English"
AF = "Afrikaans"
SQ = "Albanian"
for code, language in inspect.getmembers(Language):
if code.isalpha() and code.isupper():
_language = _Language(language)
_language.code = code
setattr(Language, code, _language)
</code></pre>
<hr/>
<p>尽管我认为如果使用dict或<code>enum.Enum</code>而不是只包含类属性的类,这可能会更好。你知道吗</p>
<p>或者,如果您想喜欢的话,这里有各种各样的<code>Enum</code>方法,它们展示了如何创建一个自定义枚举元类,该元类将使用现有的魔法,让<code>Enum</code>值知道它们的名称,还可以像在<code>_Language</code>类中那样将其他属性填充到它们中。你知道吗</p>