我可以使实例方法不能作为静态方法调用吗?

时间:2018-11-09 19:06:37

标签: python-3.x

我有一个名为@asynccontextmanager的{​​{1}}方法,它是类opened()的实例方法。有时我会像File这样错误地使用类来调用它。然后失败,因为该对象未初始化(例如,名称),并没有真正表达问题的错误。

  

AttributeError:“ str”对象没有“打开”属性

有办法防止这种情况吗?

示例

File.opened()

应该可以:

class File: 
   def __init__(self, file_name):
        self.file_name = file_name

    @asynccontextmanager
    async def opened(self):
        open(self.file_name)
        # do other things

但是他应该产生一个错误,告诉我在不首先创建对象的情况下不能使用实例方法:

file = File('input.csv')
async with file.opened() as file_handle:
    #do stuff

1 个答案:

答案 0 :(得分:1)

您可以检查self是否是File的实例,以便通过友好的错误消息引发异常:

@asynccontextmanager
async def opened(self):
    if not isinstance(self, File):
        raise RuntimeError('opened() must be called as a method bound to a File instance.')
    open(self.file_name)