Python:使用伪类传递变量名?
这是一个后续,我学到了很多东西(意译):Python:使用伪类传递变量名?,python,class,dictionary,Python,Class,Dictionary,这是一个后续,我学到了很多东西(意译): 总体而言,Python对象不知道它们的名称 不,这在*args中通常是不可能的。您必须使用关键字参数 当参数的数量固定时,可以使用locals 使用globals()。只有当值在模块范围内是唯一的时,这才有效,因此它是脆弱的 无论如何,你最好不要这样做,重新思考这个问题 第一点强调了我对Python变量的基本误解。回答是非常教育性的,几乎是瞬间的,显然这是一个既容易理解又容易混淆的话题 既然我想学习如何正确地处理事情,那么创建一个虚拟类来简单地保存附
- 总体而言,Python对象不知道它们的名称李>
- 不,这在
中通常是不可能的。您必须使用关键字参数*args
- 当参数的数量固定时,可以使用
locals
- 使用globals()。只有当值在模块范围内是唯一的时,这才有效,因此它是脆弱的
- 无论如何,你最好不要这样做,重新思考这个问题
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的值,那么更容易发现名称的拼写错误。正如我所说,不是反模式,前提是
如果不遵守这些约束,请选择具有属性的完全认可的类。我仍然不明白您的实际目的是什么。“带名称的值”的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
:)的参数