如何从python中的类实例导入方法?

时间:2019-04-11 13:53:33

标签: python class methods

我想创建一个类的实例,并在不使用语法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。

有人知道该怎么做吗?

2 个答案:

答案 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')

如果您不想在每次发出警告时都重新创建记录器对象,则可以将其作为警告函数的参数传递。