Python: файл с определенными программистом атрибутами - PullRequest
1 голос
/ 22 января 2010

Используя Python 2.5, я хотел бы создать временный файл, но добавить (и изменить) свои собственные атрибуты. Я пробовал следующее:

class  TempFileWithAttributes ( ) :
    __slots__   =   [   '_tempFile' ,  'Value'  ]
    def __init__ ( self ) :
        self._tempFile  =  tempfile.TemporaryFile()
        object.__setattr__ ( self, '_tempFile', tempfile.TemporaryFile() )
        object.__setattr__ ( self, 'Value', 123 )
    def __getattr__ ( self, name ) :
        if  name  ==  'Value' :
            object.__getattr__ ( self, 'Value' )
        elif  name  ==  '_tempFile' :
            return  getattr ( self._tempFile, name )
    def __setattr__ ( self, name, newValue ) :
        if name == 'Value' :
            object.__setattr__ ( self, 'Value', newValue )
        elif  name == '_tempFile' :
            setattr ( self._tempFile, newValue )

myFile  =  TempFileWithAttributes ( )
myFile.write ( 'Hello, Jayson!' )
print myFile.Value
myFile.Value  =  456
print myFile.Value
myFile.seek ( 0, os.SEEK_END )
print myFile.tell()

Однако меня приветствуют следующие сообщения об ошибках:

object.__setattr__ ( self, '_tempFile', tempfile.TemporaryFile() )
TypeError: can't apply this __setattr__ to instance object

Я также пытался создать подкласс file, но он тоже не работал.

Есть предложения?

Ответы [ 3 ]

2 голосов
/ 22 января 2010

Почему вы перекрываете __setattr__ вообще ?! Вы не делаете ничего полезного в своем переопределении - и ваше переопределение __getattr__ также не очень полезно. Я думаю, что вы хотите, это что-то вроде:

>>> class  TempFileWithAttributes(object):
...   __slots__ = ['_tempFile', 'Value']
...   def __init__(self):
...     self._tempFile  =  tempfile.TemporaryFile()
...     self.Value = 123
...   def __getattr__(self, name):
...     return getattr(self._tempFile, name)
... 

Это позволяет остальной части вашего примера кода работать, предположительно, как и предполагалось.

2 голосов
/ 12 марта 2013

Python жалуется на object.__setattr__ (self, 'Value', newValue ), потому что self не object.

Вам нужно наследовать от объекта:

class  TempFileWithAttributes(object):

В Python3 это происходит по умолчанию, но в Python2 этого не происходит.

0 голосов
/ 22 января 2010

Первый шаг: используйте setattr() вместо object.__setattr__()

Второй шаг: вместо setattr(anobject, 'string', value) просто используйте anobject.string = value

Потому что ваш код не имеет никакого смысла. Я даже не могу понять, что вы пытаетесь сделать.

...