Как импортировать методы из экземпляров классов в Python? - PullRequest
0 голосов
/ 11 апреля 2019

Я хочу создать экземпляр класса и вызвать методы экземпляра без синтаксиса 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 ]

2 голосов
/ 11 апреля 2019

Вы можете присваивать имена методам.

Пример:

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.

0 голосов
/ 11 апреля 2019

Это немного обходной путь, но вы можете создать следующий файл 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')

, из которого вы можете просто импортировать функцию warn:

from logger import warn

warn('This is a warning')

Если вы не хотите воссоздавать объект регистратора каждый раз, когда хотите выдать предупреждение, вы можете передать его в качестве аргумента функции warn.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...