Подтвердить что ты не робот

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

class MyClass:
    def myFunc(self):
        pass

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

4b9b3361

Ответ 1

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

def func(self):
    print("func")

class MyClass:
    myMethod = func

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

class MyClass:
    pass

def func(self):
    print("func")

MyClass.myMethod = func

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

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

Ответ 2

Вы можете определить функцию вне класса, а затем добавить ее. Однако есть небольшая разница в назначении функции классу или объекту экземпляра. Вот пример:

class MyClass1(object):
    def __init__(self, bar):
        self.foo = 'up'
        MyClass1.foobar = bar

class MyClass2(object):
    def __init__(self, bar):
        self.foo = 'up'
        self.foobar = bar

def bar(self):
    return "What " + 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 up"

Чем это отличается от 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 up"

Хотя я не уверен, стоит ли так поступать так...

Ответ 3

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

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)

Ответ 4

Я делаю съемку по тому, что вы ищете, где один класс 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

Ответ 5

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