Импорт методов из файла в класс - PullRequest
2 голосов
/ 27 октября 2011

Я делаю IRC-бот с Twisted, и у меня возникла проблема.Я хочу импортировать функции из отдельного файла в мой основной класс (тот, который наследует irc.IRCClient), чтобы их можно было использовать в качестве методов.Я подумал о двух возможных решениях, но они оба кажутся немного новичками, и у них обоих есть проблемы.

Решение 1. Поместите функции в класс в отдельный файл, импортируйте его в мой основной файл и сделайте мойОсновной класс наследует класс.Проблема с этим решением состоит в том, что я в конечном итоге унаследую довольно много классов, и мне придется изменять свой основной класс каждый раз, когда я создаю новый модуль для бота.

Решение 2: Поместите функции в отдельныйфайл, импортируйте его в мой основной файл и назначьте каждой из импортируемых функций переменную.Это раздражает, потому что мне нужно было бы установить переменную в моем главном классе для каждого из методов, которые я хочу, чтобы класс импортировал откуда-то еще.

Пример:

importthis.py

class a():
    def somemethod(self):
        print "blah"

main.py

import importthis
class mainClass(irc.IRCClient):
    thisisnowamethod = importthis.a()

Как видите, оба метода (без каламбура) требуют много глупой работы для поддержки.Есть ли более умный способ сделать это?

Ответы [ 2 ]

2 голосов
/ 27 октября 2011
class mainClass(irc.IRCClient):

    from othermodule import a, b, c
    # othermodule.a, b, and c are now methods of mainClass

    from anothermodule import *
    # everything in anothermodule is now in mainClass

    # if there are name conflicts, last import wins!

Это работает, потому что import просто импортирует символы в пространство имен и не очень заботится о том, что это за пространство имен. Модуль, класс, функция - все это связано с import.

Конечно, функции в othermodule должны быть написаны так, чтобы они принимали self в качестве первого аргумента, поскольку они станут методами экземпляров mainClass экземпляров. (Вы можете украсить их, используя @classmethod или @staticmethod, но я этого не пробовал.)

Это хороший шаблон для «встраивания», когда вы не обязательно хотите использовать множественное наследование и головные боли, которые могут вызвать.

1 голос
/ 27 октября 2011

Я думаю, что вопрос, на который нужно ответить для каждого из этих импортированных методов, заключается в том, влияет ли он на состояние объекта?Кажется, что ответ - нет - они не знают о вашем основном классе, и поэтому не должны быть методами основного класса.И я не думаю, что между вашим основным классом и теми, от которых он унаследует, есть отношения IS-A.

Но ваша проблема в том, что вы хотите, чтобы вызывающие пользователи имели доступ к этим методам?Хорошее решение - сделать эти методы доступными как модуль, который можно импортировать.

...