Python определяет метод вне определения класса?

class MyClass: def myFunc(self): pass 

Могу ли я создать MyFunc outisde определения класса? Может быть, даже в другом модуле?

5 Solutions collect form web for “Python определяет метод вне определения класса?”

Да. Вы можете определить функцию вне класса, а затем использовать ее в классе как метод:

 def func(self): print "func" class MyClass(object): myMethod = func 

Вы также можете добавить функцию в класс после ее определения:

 class MyClass(object): pass def func(self): print "func" MyClass.myMethod = func 

Вы можете определить функцию и класс в разных модулях, если хотите, но я бы советовал не определять класс в одном модуле, а затем импортировать его в другой и добавлять к нему методы динамически (как в моем втором примере), потому что тогда вы, d имеет удивительно различное поведение от класса в зависимости от того, был ли импортирован другой модуль.

Я хотел бы указать, что, хотя это возможно в Python, это немного необычно. Вы отмечаете в комментарии, что методы «пользователи могут добавлять больше». Это звучит странно. Если вы пишете библиотеку, вы, вероятно, не хотите, чтобы пользователи библиотеки динамически добавляли методы в классы в библиотеке. Для пользователей библиотеки более естественно создавать свой собственный подкласс, который наследуется от вашего класса, а не напрямую менять ваш.

Не уверен, что это полезно, но это немного облегчило мне. Хотя я не уверен, что это хорошая практика, чтобы делать это так …

 class MyClass1(object): def __init__(self, bar): self.foo = 'updog' MyClass1.foobar = bar class MyClass2(object): def __init__(self, bar): self.foo = 'updog' self.foobar = bar def bar(self): return "What's " + self.foo 

Давайте сначала посмотрим, что происходит в MyClass1 . foobar в этом классе похож на обычный метод, как если бы он был определен внутри определения класса (т. е. это метод, связанный с экземпляром этого класса). Давайте посмотрим, как это выглядит …

 In [2]: x = MyClass1(bar) In [3]: x.foobar Out[3]: <bound method MyClass1.bar of <__main__.MyClass1 object at 0x104346990>> In [4]: x.foobar() Out[4]: "What's updog" 

Как это отличается от MyClass2 ? В MyClass2 foobar – это просто ссылка на функцию бара и НЕ является связанным методом. Из-за этого мы должны передать экземпляр, чтобы эта функция работала должным образом. например

 In [5]: y = MyClass2(bar) In [6]: y.foobar Out[6]: <function __main__.bar> In [7]: y.foobar() --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-7-6feb04878e5f> in <module>() ----> 1 y.foobar() TypeError: bar() takes exactly 1 argument (0 given) In [8]: y.foobar(y) Out[8]: "What's updog" 

Надеюсь, это делает его таким же ясным, как грязь …

Я делаю съемку по тому, что вы ищете, где один класс Helper предоставляет функции специализированному классу ( MyClass )

 class Helper(object): def add(self, a, b): return a + b def mul(self, a, b): return a * b class MyClass(Helper): def __init__(self): Helper.__init__(self) print self.add(1, 1) if __name__ == '__main__': obj = MyClass() 

Это напечатает

 >>> 2 

Да, вы можете определенно иметь функции вне класса. Вот мини-пример …

 def date_parse(date_string): return date(date_string) class MyClass: def myFunc(self): pass def myDateFunc(self, date_string): self.date = date_parse(date_string) 

не уверен, соответствует ли вам сценарий, но вы можете использовать MyClass и добавить нужную функцию.

  • Почему numpy имеет соответствующую функцию для многих методов ndarray?
  • Как сказать, когда метод вызывается в первый раз для многих
  • python, динамически реализовать класс onthefly
  • Лучшее понимание использования __str__
  • использование несвязанных методов в другом классе python
  • Что делает оператор «как»?
  • Почему некоторые функции подчеркивают «__» до и после имени функции?
  • Выполнить методы класса в потоках (python)
  •  
    Interesting Posts for Van-Lav

    Как я могу защитить свой идентификатор доступа AWS и секретный ключ в моем приложении python

    Обрезка дендрограммы на уровнях в Scipy Hierarchical Clustering

    Pythonic способ конвертировать словарь в namedtuple или другой хэшируемый dict-like?

    Как добавить скрипт python в реестр запуска?

    Интерполяция ConfigParser и String с переменной env

    Malformed Packet: вложенная форма администратора Django не может быть отправлена, соединение было сброшено

    Сбор трипсина (расщепление) не работает с использованием регулярного выражения

    Нумерология для вычисления матричных несовершеннолетних?

    Почему Django 1.7 переходит из syncdb для переноса?

    Как использовать дополнительные аргументы, переданные с переменным файлом – Robot framework

    как читать выведенную fortran двоичную матрицу NxNxN в Python

    Проблема с меткой времени курсора python postgres

    Фляжка не служит изображениям

    Поймать любую ошибку в Python

    StringListProperty ограничивается 500 строками символов (Google App Engine / Python)

    Python - лучший язык программирования в мире.