2012-02-18 3 views
0

Я подклассифицировал StringIO для создания класса MockFile. В производном классе должен быть атрибут «name», но при создании этого атрибута создается AttributeError.io.StringIO переписывает унаследованное свойство - делать или не делать?

Puzzled я сделал __dict__ и нашел, что уже есть name -key. Итерируя через __mro__, я нашел свойство с именем 'name', явно доступное только для чтения в классе io.TextIOWrapper.

Так у меня есть в основном два вопроса:

  1. за то, что это свойство «имя» предназначено
  2. это безопасно переписать его с 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

name свойство io.StringIO в Python 2.6 происходит от иерархии классов в io модуле. Это сложная настройка как с наследованием, так и с составом, а свойство name используется для распространения имен из базовых объектов на различные обертки и специализации. Фактическое свойство на io.StringIO ушло в Python 2.7 и более поздних версиях, поэтому вы должны быть в тени, чтобы затенять его в вашем подклассе.

Вы не можете использовать setattr(), чтобы назначить объект больше, чем фактическое задание - settattr() и присвоение атрибутов работают одинаково. Характер свойства не позволяет вам затенять свойство baseclass атрибутом экземпляра (не делая больше). Однако вы можете определить собственное свойство с тем же именем или обмануть Python, чтобы не видеть свойство в первую очередь:

class MockFile(StringIO): 
    name = None 
    def __init__(self, name, buffer_ = None): 
     super(MockFile, self).__init__(buffer_) 
     self.name = name  
+1

Только для записи трюк затенения свойства с атрибутом экземпляра не работает во всех случаях (он не работает для свойств, имеющих сеттер.) –

Смежные вопросы