如何解决在类定义的装饰器上无法调用NoneType对象
我有一个奇怪的特定问题,与SE上常见的总体NoneType
对象问题有关。我尝试使用修饰器功能打开文件,而修饰的功能将应用特定于文件类型的特定操作(aka文本,RTF,PDF等)
该过程可以很好地解析,并且可以通过对象创建和类初始化进行工作,但是当我尝试调用PDFReader
函数时会引发异常,该函数目前仅具有"Reached"
的调试打印语句。
我发现这是由于我使用的双重定义方法所致,因为函数调用似乎在父函数中,而我尝试访问的实际参数只能在子函数中使用。
我的问题是:如果我希望有一个通过self
使用对象的初始化变量的类绑定装饰器,如何修复我的代码,或者有更好的方法来实现我正在尝试的东西?
Filehandler.py:
class Fileloader(object):
class _decorators():
@classmethod
def _reader(cls,decorated):
print('File opened in Read-Only Mode')
#---No error if "decorated()" called here.
def decorator(self,*args,**kwargs):
print(self._file) #---Prints to console then throws the exception
decorated(self,**kwargs)
...
def __init__(self,filename,mode='rb'):
self._file = filename
self._mode = mode
print(self._file)
@_decorators._reader
def pdfReader(self):
print("reached") #---never reached
...
Test = Fileloader('test.pdf')
Test.pdfReader()
解决方法
超级容易修复,我只是盯着代码看了很久。
感谢@martineau指出我的外部装饰器不返回任何内容。
固定代码不变
class Fileloader(object):
class _decorators():
@classmethod
def _reader(cls,decorated):
print('File opened in Read-Only Mode')
def decorator(self,*args,**kwargs):
print(self._file)
with open(self._file,mode=self._mode) as self.f:
print('Decorator')
decorated(self,**kwargs)
pass
return decorator #<----- Added this and it works as it should
edit:对于我之后的那些需要解释发生的事情的人,我制作了一个内部类class _decorators()
来允许使用嵌套函数(@classmethod def_reader(cls,decorated)
,该函数采用{ {1}}(类的缩写)和cls
(这是我用于传递函数的关键字),然后定义一个内部函数,以便我可以访问该对象的decorated
字典,这是由于Python的工作原理而完成的。
Python将首先解析部分代码,因此,如果我只有内部函数self
,则它将传递异常,因为此时没有decorator
属性。
它通过self
初始化对象之后,它确实具有一个Test = Fileloader('test.pdf')
属性,可以在运行时由内部函数self
访问。因此,对嵌套函数的解析器需求将在解析时由内部函数传递,但在实例化对象时将在运行时返回并读取它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。