Seite 2 von 2

Re: OOP Problem / Verständnisfrage bezüglich 'self'

Verfasst: Dienstag 7. März 2017, 19:15
von jerch
Dazu ergänzend:

Code: Alles auswählen

In [1]: class Test(object):
   ...:     def test1(self):
   ...:         print self
   ...:         

In [2]: def test_function(self):
   ...:     print self
   ...:     

In [3]: test_obj = Test()

In [4]: test_obj.test2 = test_function

In [5]: Test.test3 = test_function

In [6]: test_obj.test1()
<__main__.Test object at 0x7f1c798d6c10>

In [7]: type(test_obj.test1)
Out[7]: instancemethod

In [8]: test_obj.test2()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-9-b50a9d669b63> in <module>()
----> 1 test_obj.test2()

TypeError: test_function() takes exactly 1 argument (0 given)

In [9]: type(test_obj.test2)
Out[9]: function

In [10]: test_obj.test3()
<__main__.Test object at 0x7f1c798d6c10>

In [11]: type(test_obj.test3)
Out[11]: instancemethod
Hieran schieht man, dass Methoden nicht einfach Funktionsattribute am Exemplar sind, sondern die Funktionen zu Methoden "umdekoriert" werden (Typ ändert sich). Dabei wird das `self` relevant, auf Pythonebene wird `self.methodA(attr1)` zu `function_behind_methodA(self, attr1)` übersetzt. Im obigen Beispielcode kann man das für `test_obj.test2` von Hand machen per `test_obj.test2(test_obj)`. Für Funktionsattribute auf Klassenebene macht Python das automatisch, daher funktioniert `test_obj.test3` wie erwartet.