2010-01-22 39 views
1

使用Python 2.5,我想創建一個臨時文件,但添加(&修改)我自己的屬性。我已經試過如下:Python:具有程序員定義屬性的文件

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,但沒有工作,要麼。

有什麼建議嗎?

回答

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) 
... 

這不會讓你的示例代碼的其他作品,大概是因爲預期。

+1

本質上,我離開發布只有幾秒鐘的確切代碼。詛咒你Martelli!然而'__slots__'在這裏很可能是不必要的,所以我會放棄這一點。 – 2010-01-22 18:22:42

+0

非常感謝大家,特別是你,Martelli先生。你的解決方案直接爲我工作! – JaysonFix 2010-01-22 18:27:19

+0

@Jason,yep,'__slots__'只能保存幾十個字節,可能無關緊要,因爲一個程序不太可能同時擁有這個類的大量對象。 – 2010-01-22 18:28:24

0

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

第二步:與其setattr(anobject, 'string', value)只使用anobject.string = value

因爲你的代碼是沒有任何意義。我甚至不知道你在做什麼。

+2

這不是一個答案。 – 2010-01-22 18:21:30

+0

是的。我甚至嘗試過。擺脫所有的廢話'__getattr__'和'__setattr__'意味着它的作品。 – 2010-01-22 18:22:34

2

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

你需要的是從對象繼承:

class TempFileWithAttributes(object): 

在Python3在默認情況下發生,但在Python2它沒有。

+0

我有類似的問題,這是我需要感謝 – lathomas64 2016-12-20 23:19:52

相關問題