1

使用 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

我也尝试过 subclassing file,但这也不起作用。

有什么建议么?

4

3 回答 3

2

你为什么要压倒__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)
... 

这确实让您的示例代码的其余部分按预期工作。

于 2010-01-22T18:19:30.203 回答
2

Python 抱怨object.__setattr__ (self, 'Value', newValue )因为self不是object.

您需要的是从对象继承:

class  TempFileWithAttributes(object):

在 Python3 中默认情况下会发生这种情况,但在 Python2 中则不会。

于 2013-03-12T19:57:51.610 回答
0

第一步:使用setattr()代替object.__setattr__()

第二步:而setattr(anobject, 'string', value)不仅仅是使用anobject.string = value

因为您的代码毫无意义。我什至无法弄清楚你想做什么。

于 2010-01-22T18:11:06.943 回答