Re: OOP Problem / Verständnisfrage bezüglich 'self'
Verfasst: Dienstag 7. März 2017, 19:15
Dazu ergänzend:
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.
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