Zuverlässige Methode, Klasse ungebundener Methoden zu bekommen

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.
Antworten
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Hallo,

ich wollte einmal fragen, ob es irgendeine, wenigstens in den meisten Fällen zuverlässige Methode gibt, die Klasse einer ungebundenen Methode zu bekommen.
Kurz zur Erklärung:

Code: Alles auswählen

class A:
    def f():
        pass
Ich möchte nun nicht nur das Objekt A anhand von A().f bekommen, sondern auch allein anhand von A.f. Ich habe schon einige Dinge versucht, aber zumindest Python 3.7 scheint es nicht ganz trivial zu sein.
Hat da jemand eine Idee?

Vielen Dank.
Zuletzt geändert von sprudel am Samstag 29. Dezember 2018, 00:18, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

A ist kein Objekt. Es ist ein Klasse. A.f ist eine UNGEBUNDENE Methode. Von der aus kannst du auch nur die Klasse bekommen.

Was willst du erreichen? Kannst du das mal etwas ausführlicher beschrieben?
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Entschuldige, habe mich da etwas formuliert. Natürlich ist es eine ungebundene Methode. Aber auch A selbst ist ein Objekt, wie auch eine Klasse es ist. Konkret möchte ich gerne die Möglichkeit haben, Methoden zu annotieren und hierbei eben normale Funktionen von Methoden unterscheiden, um ggf. die Klasse in einem statischen Kontext darüber zu "informieren". Konkret geht es noch um einige "Basteleien", aber alles mit der Option, es ggf. auch mal konkreter zu verwenden :-)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe immer noch nicht den leisesten Hauch Ahnung was du da tun willst - aber schau dir mal das Deskriptor Protokoll an, das mag da helfen. Damit werde auch Properties gebaut.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

In Python 3 gibt es keine ungebundenen Methoden mehr. Methoden in einer Klasse sind nicht von Funktionen unterscheidbar und sie haben auch keine Referenz auf die sie enthaltende Klasse. Und sie können Methoden mehrerer Klassen sein. Beispiel:

Code: Alles auswählen

» ipython2
Python 2.7.15 (default, Jun 27 2018, 13:05:28)

In [1]: def f():
   ...:     pass
   ...:

In [2]: class A(object):
   ...:     g = f
   ...:

In [3]: A.g is f
Out[3]: False

» ipython
Python 3.7.1 (default, Oct 22 2018, 10:41:28)

In [1]: def f():
   ...:     pass
   ...:

In [2]: class A:
   ...:     g = f
   ...:

In [3]: A.g is f
Out[3]: True
Ich hab’ zwar auch nicht verstanden, was du willst, aber eventuell wäre ein Klassendekorator oder eine Metaklasse etwas, was dir helfen könnte.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@sprudel: die Klassendefinition ist erst mal nur eine Sammlung von Funktionen. Zur gebundenen Methode werden sie erst, wenn sie über eine Instanz referenziert werden:

Code: Alles auswählen

>>> class A: pass
... 
>>> a = A()
>>> A.f = lambda self, a: a*2
>>> A.f
<function <lambda> at 0x1060bc1e0>
>>> a.f
<bound method <lambda> of <__main__.A object at 0x1061ca240>>
Kannst Du mal ein konkretes Beispiel am Besten mit Beispielcode (mit erwartetem Ergebnis, muß dann nicht unbedingt funktionieren) machen?
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Kennst du schon ismethod() aus dem inspect-Modul? Evtl reicht dir das ja...
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

So etwas in der Art?

Code: Alles auswählen

class B:
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return '{}({})'.format(self.__class__.__name__, self.name)


class A:
    @staticmethod
    def f(name):
        return B(name)

objekt_von_B = A.f('foo')
print(objekt_von_B)
Ausgabe:

Code: Alles auswählen

B(foo)
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten