Python:使用伪类传递变量名?

Python:使用伪类传递变量名?,python,class,dictionary,Python,Class,Dictionary,这是一个后续,我学到了很多东西(意译): 总体而言,Python对象不知道它们的名称 不,这在*args中通常是不可能的。您必须使用关键字参数 当参数的数量固定时,可以使用locals 使用globals()。只有当值在模块范围内是唯一的时,这才有效,因此它是脆弱的 无论如何,你最好不要这样做,重新思考这个问题 第一点强调了我对Python变量的基本误解。回答是非常教育性的,几乎是瞬间的,显然这是一个既容易理解又容易混淆的话题 既然我想学习如何正确地处理事情,那么创建一个虚拟类来简单地保存附

这是一个后续,我学到了很多东西(意译):

  • 总体而言,Python对象不知道它们的名称
  • 不,这在
    *args
    中通常是不可能的。您必须使用关键字参数
  • 当参数的数量固定时,可以使用
    locals
  • 使用globals()。只有当值在模块范围内是唯一的时,这才有效,因此它是脆弱的
  • 无论如何,你最好不要这样做,重新思考这个问题
第一点强调了我对Python变量的基本误解。回答是非常教育性的,几乎是瞬间的,显然这是一个既容易理解又容易混淆的话题

既然我想学习如何正确地处理事情,那么创建一个虚拟类来简单地保存附加了名称的变量是否被认为是不好的做法

class system: pass
S = system ()
S.T = 1.0
S.N = 20
S.L = 10

print vars(S)

这实现了我的初衷,但我想知道是否有什么我没有考虑过的东西以后会咬我。

你可以这样做,但为什么不使用字典呢

但是如果你这样做,你最好将关键字args传递给类的构造函数,然后让构造函数将它们复制到应用程序的成员。比如:

class Foo(object):

    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

我这样做是为了向Javascript致敬,在Javascript中,字典和实例变量之间没有任何区别。我认为它不一定是一个反模式,也因为与字典不同,如果您没有引发AttributeError而不是KeyError的值,那么更容易发现名称的拼写错误。正如我所说,不是反模式,前提是

  • 该类的范围仅限于非常特定的用法
  • 您正在调用的例程或方法(例如示例中的vars)本质上是私有的。我不希望有一个具有这种调用语义的公共接口,也不希望它作为一个返回的实体
  • “dummy”类的名称在其意图和所代表的聚合类型方面非常清楚
  • 该对象的生命周期短且平淡无奇。这只是一个临时的数据包

  • 如果不遵守这些约束,请选择具有属性的完全认可的类。

    我仍然不明白您的实际目的是什么。“带名称的值”的Python数据结构是一个字典:
    dict(T=1.0,N=20,L=10)
    。有些情况下,有些人更喜欢您使用的名称空间对象,但如果没有更多的上下文,就很难给出建议。我是否遗漏了什么?这给了你什么词典没有的东西?@PaoloBergantino:例如,
    argparse
    使用这样的名称空间对象,因为有时通过
    S.t
    访问属性比通过噪音更大的
    S[“t”]更方便
    。您也可以不复制:
    self.\uuu dict\uuu=kwargs
    。这是否要求您在构造时了解所有输入参数?这比添加带有
    S.x
    的成员有什么好处?@SvenMarnach是的,但是你不能像自定义
    \uuuu repr\uuuu
    @Hooked那样向类添加任何方法,只需要更少的代码行和更少的代码即可。如果您愿意,您可以同时执行这两项操作。@SvenMarnach您是对的,它不会覆盖它,除非您传递一个名为
    \uuuuuuuu repr\uuuuu
    :)的参数