Seite 1 von 1

Zuverlässige Methode, Klasse ungebundener Methoden zu bekommen

Verfasst: Samstag 29. Dezember 2018, 00:11
von sprudel
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.

Re: Zuverlässige Methode, Klasse ungebundener Methoden zu bekommen

Verfasst: Samstag 29. Dezember 2018, 00:15
von __deets__
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?

Re: Zuverlässige Methode, Klasse ungebundener Methoden zu bekommen

Verfasst: Samstag 29. Dezember 2018, 00:17
von sprudel
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 :-)

Re: Zuverlässige Methode, Klasse ungebundener Methoden zu bekommen

Verfasst: Samstag 29. Dezember 2018, 01:10
von __deets__
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.

Re: Zuverlässige Methode, Klasse ungebundener Methoden zu bekommen

Verfasst: Samstag 29. Dezember 2018, 09:55
von narpfel
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.

Re: Zuverlässige Methode, Klasse ungebundener Methoden zu bekommen

Verfasst: Samstag 29. Dezember 2018, 10:00
von Sirius3
@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?

Re: Zuverlässige Methode, Klasse ungebundener Methoden zu bekommen

Verfasst: Samstag 29. Dezember 2018, 10:14
von snafu
Kennst du schon ismethod() aus dem inspect-Modul? Evtl reicht dir das ja...

Re: Zuverlässige Methode, Klasse ungebundener Methoden zu bekommen

Verfasst: Samstag 29. Dezember 2018, 13:34
von DeaD_EyE
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)