我从StringIO子类创建了一个MockFile类。派生类中应该有一个属性“name
”,但创建此属性会抛出AttributeError
。
困惑的是,我进行了__dict__
次查找,发现已经存在name
- 密钥。迭代__mro__
我发现了一个名为“name
”的属性,在io.TextIOWrapper
类中显然是只读的。
所以我基本上有两个问题:
settattr
作业覆盖它是否安全?completness的示例代码:
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
答案 0 :(得分:1)
Python 2.6中name
的{{1}}属性来自io.StringIO
模块中的类层次结构。它具有继承和组合的复杂设置,io
属性用于将名称从底层对象传播到各种包装和专门化。 name
上的实际属性在Python 2.7及更高版本中已经消失了,所以你应该可以在你的子类中隐藏它。
您不能使用io.StringIO
来设置属性,而不是实际分配 - setattr()
和属性分配都以相同的方式工作。属性的性质使您无法使用实例属性隐藏基类属性(不做更多操作。)但是,您可以使用相同的名称定义自己的属性,或者欺骗Python以便首先看不到属性:
settattr()