Python 使用dict vs class\uuuu dict\uuuu方法格式化字符串
我一直在使用dict格式化字符串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运算
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<和
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')