【问题标题】:Python: file with programmer-defined attributesPython:具有程序员定义属性的文件
【发布时间】:2010-01-22 17:57:22
【问题描述】:

使用 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 进行子类化,但这也不起作用。

有什么建议吗?

【问题讨论】:

    标签: python file subclassing


    【解决方案1】:

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

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

    【讨论】:

    • 基本上是我在几秒钟后发布的确切代码。诅咒你马尔泰利!但是__slots__ 在这里很可能是不必要的,所以我会放弃它。
    • 非常感谢大家,尤其是您,Martelli 先生。您的解决方案立即为我工作!
    • @Jason,是的,__slots__ 只节省了几十个字节,这可能无关紧要,因为一个程序不太可能同时拥有大量此类“活动”对象。
    • @JaysonFix,不客气,但请考虑遵循 Jason Orendorff 的建议并删除 __slots__ = 行,这并没有真正让你买太多(尽管它并不完全损坏 你也可以,一个基本免费的代码简化值得追求)。
    • slots 分配已被删除...效果很好!再次感谢。
    【解决方案2】:

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

    你需要的是从对象继承:

    class  TempFileWithAttributes(object):
    

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

    【讨论】:

    • 我遇到了类似的问题,这正是我需要的,谢谢
    【解决方案3】:

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

    第二步:用anobject.string = value代替setattr(anobject, 'string', value)

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

    【讨论】:

    • 是的。我什至试过了。摆脱所有废话 __getattr____setattr__ 意味着它有效。
    猜你喜欢
    • 1970-01-01
    • 2018-11-19
    • 2019-07-27
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    相关资源
    最近更新 更多