Не уверен, что это полезно, но это сделало его немного более понятным для меня.Хотя я не уверен, является ли это хорошей практикой, делать это таким образом ...
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"
Надеюсь, это так же ясно, как грязь ...