我想创建一个类的实例,并在不使用语法I.method
的情况下调用实例化的方法。相反,我想称其为method
。这可能吗?如果可以,怎么办?下面是我想如何执行此操作的具体示例。
这样做的动机是,在这种特定情况下,代码看起来更简洁,编写起来也更快。 (warn()
的写入速度比logger.warn()
快)
我正在使用记录器来记录错误和警告:
import logging
import sys
logger = logging.getLogger('__main__') #only report main logs
handler = logging.StreamHandler(sys.stdout) #put to standout
logger.setLevel("DEBUG")
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
logger.warn('This is a warning')
logger.info('this is just info')
写logger
(或任何实例化的东西)很烦人。
我希望能够执行以下操作:
import logging
import sys
logger = logging.getLogger('__main__') #only report main logs
handler = logging.StreamHandler(sys.stdout) #put to standout
logger.setLevel("DEBUG")
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
#Magic line of code
warn('This is a warning') #not logging.warn
info('this is just info')
但是,我不能做这样的事情
from logging import *
warn('this is a warning')
因为这不会以我想要的方式实例化日志记录类(例如,仅报告主日志并打印到sys.stdout。
有人知道该怎么做吗?
答案 0 :(得分:2)
您可以为方法分配名称。
示例:
class Class:
def __init__(self, attribute):
self.attribute = attribute
def method(self, prefix):
print(prefix, self.attribute)
mine = Class('Only A Plank Between One And Perdition')
free_function = mine.method
free_function('And I Say,')
输出:
And I Say, Only A Plank Between One And Perdition
在您的情况下,您需要warn = logger.warn
。
答案 1 :(得分:0)
这是一个变通办法,但是您可以创建以下文件logger.py:
import logging
import sys
class Logger:
def __init__(self):
self.logger = logging.getLogger('__main__') #only report main logs
handler = logging.StreamHandler(sys.stdout) #put to standout
self.logger.setLevel("DEBUG")
handler.setLevel(logging.DEBUG)
self.logger.addHandler(handler)
def warn(message):
logger = Logger()
return logger.logger.warn('This is a warning')
您可以从此处导入警告功能:
from logger import warn
warn('This is a warning')
如果您不想在每次发出警告时都重新创建记录器对象,则可以将其作为警告函数的参数传递。