Python io.StringIO覆盖继承的属性-执行还是不执行?
我从StringIO子类创建了一个MockFile类。派生类中应该有一个属性“Python io.StringIO覆盖继承的属性-执行还是不执行?,python,python-2.6,Python,Python 2.6,我从StringIO子类创建了一个MockFile类。派生类中应该有一个属性“name”,但是创建此属性会抛出一个AttributeError 困惑的是,我做了一个\uu dict\uuu查找,发现已经有一个名称-键。在\uuu mro\uuu中迭代时,我发现一个名为“name”的属性,显然是io.TextIOWrapper类中的只读属性 所以我基本上有两个问题: 此“名称”属性的用途是什么 用settattr赋值覆盖它是否安全 完整性示例代码: class MockFile(StringIO)
name
”,但是创建此属性会抛出一个AttributeError
困惑的是,我做了一个\uu dict\uuu
查找,发现已经有一个名称
-键。在\uuu mro\uuu
中迭代时,我发现一个名为“name
”的属性,显然是io.TextIOWrapper
类中的只读属性
所以我基本上有两个问题:
settattr
赋值覆盖它是否安全class MockFile(StringIO):
def __init__(self, name, buffer_ = None):
super(MockFile, self).__init__(buffer_)
self.name = name
>>> mfile = MockFile('stringio.tmp', u'#MockFile')
导致:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in __init__
AttributeError: can't set attribute
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第4行,在_init中__
AttributeError:无法设置属性
Python 2.6中io.StringIO
的name
属性来自io
模块中的类层次结构。这是一个既有继承又有组合的复杂设置,name
属性用于将名称从底层对象传播到各种包装器和专门化。然而,io.StringIO
上的实际属性在Python2.7及更高版本中消失了,因此您可以在子类中对其进行阴影处理
不能使用setattr()
设置属性,只能使用实际赋值--settattr()
和属性赋值的工作方式相同。属性的性质使您无法使用实例属性隐藏基类属性(无需执行更多操作)。但是,您可以使用相同的名称定义自己的属性,或者诱使Python从一开始就看不到该属性:
class MockFile(StringIO):
name = None
def __init__(self, name, buffer_ = None):
super(MockFile, self).__init__(buffer_)
self.name = name
仅就记录而言,使用实例属性隐藏属性的技巧并不适用于所有情况(它不适用于具有setter的属性)