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

サブクラス化も試しまし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

は. 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)2番目のステップ:単に使用する代わりにanobject.string = value

あなたのコードはまったく意味をなさないからです。私はあなたが何をしようとしているのかさえ理解できません。

于 2010-01-22T18:11:06.943 に答える