class MyClass:
def myFunc(self):
pass
Могу ли я создать MyFunc()
вне определения класса, может быть, даже в другом модуле?
class MyClass:
def myFunc(self):
pass
Могу ли я создать MyFunc()
вне определения класса, может быть, даже в другом модуле?
Да. Вы можете определить функцию вне класса, а затем использовать ее в теле класса как метод:
def func(self):
print("func")
class MyClass:
myMethod = func
Вы также можете добавить функцию в класс после того, как он был определен:
class MyClass:
pass
def func(self):
print("func")
MyClass.myMethod = func
Вы можете определить функцию и класс в разных модулях, если хотите, но я бы посоветовал не определять класс в одном модуле, а затем импортировать его в другой и добавлять к нему методы динамически (как в моем втором примере), потому что тогда вы ' будет удивительно отличаться от класса в зависимости от того, был ли импортирован другой модуль.
Я хотел бы отметить, что хотя это возможно в Python, это немного необычно. Вы упоминаете в комментарии, что "пользователям разрешено добавлять больше" методов. Это звучит странно. Если вы пишете библиотеку, вы, вероятно, не хотите, чтобы пользователи библиотеки динамически добавляли методы к классам в библиотеке. Для пользователей библиотеки более нормальным является создание своего собственного подкласса, который наследуется от вашего класса, чем непосредственное изменение вашего.
Вы можете определить функцию вне класса, а затем добавить ее. Однако есть небольшая разница в назначении функции классу или объекту экземпляра. Вот пример:
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"
Хотя я не уверен, стоит ли так поступать так...
Да, вы можете определенно иметь функции вне класса. Вот мини-пример...
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)
Я делаю съемку по тому, что вы ищете, где один класс 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
не уверен, соответствует ли вам сценарий, но вы можете получить MyClass и добавить нужную функцию.