Python 使用dict vs class\uuuu dict\uuuu方法格式化字符串

Python 使用dict vs class\uuuu dict\uuuu方法格式化字符串,python,Python,我一直在使用dict格式化字符串 s = '%(name1)s %(name2)s' d = {} d['name1'] = 'asdf' d['name2'] = 'whatever' result = s % d 我刚刚意识到我可以通过一个类和使用dict方法来实现这一点 相反: (显然,我这样做是为了更大的字符串和许多键) 我忽略的课堂教学法有什么缺点吗? 或者有没有更好的方法来进行我缺少的字符串格式化 谢谢。您可以使用新样式的格式,它允许格式字符串中的getattr和getitem运算

我一直在使用dict格式化字符串

s = '%(name1)s %(name2)s'
d = {}
d['name1'] = 'asdf'
d['name2'] = 'whatever'
result = s % d
我刚刚意识到我可以通过一个类和使用dict方法来实现这一点 相反:

(显然,我这样做是为了更大的字符串和许多键)

我忽略的课堂教学法有什么缺点吗? 或者有没有更好的方法来进行我缺少的字符串格式化


谢谢。

您可以使用新样式的格式,它允许格式字符串中的getattr和getitem运算符:

>>> class X(object):
...     pass
... 
>>> x = X()
>>> x.x = 1
>>> d = {'a':1, 'b':2}
>>> "{0[a]} {0[b]} {1.x}".format(d, x)
'1 2 1'
关于方法的缺点-对象的
\uuu dict\uuu
仅限于特定实例具有的任何属性和方法,因此在类级别定义的任何属性/方法都将失败:

>>> class X(object):
...     x1 = 1
... 
>>> x = X()
>>> x.x2 = 2
>>> x.__dict__
{'x2': 2}
>>> x.x1
1
>>> x.__dict__['x1']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'x1'
>>X类(对象):
...     x1=1
... 
>>>x=x()
>>>x.x2=2
>>>第十条__
{'x2':2}
>>>x.x1
1.
>>>x.uuu dict_uuuuuu['x1']
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
KeyError:'x1'

它也不适用于<>代码> SysStx<和SyGETAtesteTe> 重写。

< p>也可以考虑使用关键字参数创建DICT,例如:

d = dict(name1='foo', name2='bar')
或使用格式的关键字参数:

"{name1} baz {name2}".format(name1='foo', name2='bar')

您的意思是,
\uu dict\uu
将不包含类级属性。在超类
\uuuuu init\uuuu
中定义的属性将显示在子类实例的
\uuu dict\uuuu
中(假设您记得让子类
\uuuuu init\uuuuu
调用超类
\uuuuuu init\uuuu
)。类
X2
具有属性
X2
。但是这个类的实例,
x
,在它的
目录中没有
x2
。当您执行
x.x2
时,python会进行MRO查找,并从
x2.\uuu dict\uuuu
中获取值
x.\uu dict\uu
将只保存显式绑定到此特定实例的值。@Daniel,那么当您说“继承”时,您是指“从其类继承的实例”吗?这是一个有趣的术语用法,我通常认为继承是从一个类到另一个类。定义为
self.name=something
的属性将在实例上定义,并将存储在实例的
\uuuuu dict\uuuu
中,而不管这是在派生类还是超类中发生的。关于OP,您的观点是OP计划通过
d.\uu dict\uuu
,因为任何类属性的字符串插值映射都失败;我只是觉得把这称为继承问题是不正确的。@Paul,不,当我说“继承”时,在我的示例中,我指的是从X1类继承的X2类。实例vs类在下一句中提到,“而且,它也不包含类级属性”。一般来说,我只是指出,
getattr(instance,attr)
instance肯定不一样。
因此它可能会导致意外的关键错误。@Daniel-这句话“你的实例的
\uu dict\uu
将不包含继承的属性”是不完全正确的。它不会包含继承的类属性,但也不会包含任何类属性。另一方面,它将包含继承的实例属性。为X1和X2编写
\uuuuuu init\uuuuu
方法,确保
X2.\uuuuuu init\uuuuu
调用
X1.\uuuuuuuuu init\uuuu
,并在两者中分配实例属性。X2的实例将包含这两个实例属性。
"{name1} baz {name2}".format(name1='foo', name2='bar')