io.StringIO覆盖继承的属性 - 做或不做?

时间:2012-02-18 10:00:05

标签: python python-2.6

我从StringIO子类创建了一个MockFile类。派生类中应该有一个属性“name”,但创建此属性会抛出AttributeError

困惑的是,我进行了__dict__次查找,发现已经存在name - 密钥。迭代__mro__我发现了一个名为“name”的属性,在io.TextIOWrapper类中显然是只读的。

所以我基本上有两个问题:

  1. 这个'name'属性是什么意思
  2. 使用settattr作业覆盖它是否安全?
  3. 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
    

1 个答案:

答案 0 :(得分:1)

Python 2.6中name的{​​{1}}属性来自io.StringIO模块中的类层次结构。它具有继承和组合的复杂设置,io属性用于将名称从底层对象传播到各种包装和专门化。 name上的实际属性在Python 2.7及更高版本中已经消失了,所以你应该可以在你的子类中隐藏它。

您不能使用io.StringIO来设置属性,而不是实际分配 - setattr()和属性分配都以相同的方式工作。属性的性质使您无法使用实例属性隐藏基类属性(不做更多操作。)但是,您可以使用相同的名称定义自己的属性,或者欺骗Python以便首先看不到属性:

settattr()