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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

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.
Antworten