Python io.StringIO覆盖继承的属性-执行还是不执行?

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)

我从StringIO子类创建了一个MockFile类。派生类中应该有一个属性“
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的属性)