Frage

Was ist der richtige Weg, um eine Schleife über ein Verfahren der Python-Objekts und nennt sie?

Da das Objekt:

class SomeTest():
  def something1(self):
    print "something 1"
  def something2(self):
    print "something 2"

Keine korrekte Lösung

Andere Tipps

Sie können das Modul überprüfen verwenden, um Klasse (oder Instanz) Mitglieder zu erhalten:

>>> class C(object):
...     a = 'blah'
...     def b(self):
...             pass
... 
...
>>> c = C()
>>> inspect.getmembers(c, inspect.ismethod)
[('b', <bound method C.b of <__main__.C object at 0x100498250>>)]

GetMembers () gibt eine Liste von Tupeln, wobei jedes Tupel (Name, Mitglied). Das zweite Argument für GetMembers () ist das Prädikat, das die Rückgabeliste filtert (in diesem Fall nur Methode Objekten Rückkehr)

Methoden vs. Funktionen und andere Arten von Callables ...

(Um das Problem in den Kommentaren in Unknown Postadresse.)

Zunächst ist zu beachten, dass, zusätzlich zu dem benutzerdefinierten Methoden gibt es integrierte Methoden und eine integrierte Methode ist, als doc unter http://docs.python.org/reference/datamodel.html sagt: "wirklich eine andere Verkleidung eines integrierten Funktion"( das ist ein Wrapper um eine C-Funktion.)

Wie für benutzerdefinierte Methoden, wie Unknown zitiert Zitat sagt:

  

Ein benutzerdefiniertes Verfahrensobjekt Mähdrescher   eine Klasse, eine Klasseninstanz (oder keine)   und jedes aufrufbare Objekt (normalerweise ein   benutzerdefinierte Funktion).

Das bedeutet aber nicht, dass „alles, was __call__ und ist an ein Objekt definiert eine Methode ist.“ Eine Methode ist eine aufrufbar, aber ein aufrufbar ist nicht unbedingt ein Verfahren. Benutzerdefinierte Methoden sind Wrapper um das, was das Zitat sagt.

Hoffentlich Ausgabe (von Python 2.5.2, die ich habe praktisch) die Unterscheidung zeigen:

IDLE 1.2.2      
>>> class A(object):
    x = 7


>>> A  # show the class object
<class '__main__.A'>
>>> a = A()
>>> a  # show the instance
<__main__.A object at 0x021AFBF0>
>>> def test_func(self):
    print self.x


>>> type(test_func)  # what type is it?
<type 'function'>
>>> dir(test_func)  # what does it have?
['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get__',
 '__getattribute__', '__hash__', '__init__', '__module__', '__name__',
 '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
 '__str__', 'func_closure', 'func_code', 'func_defaults', 'func_dict',
 'func_doc', 'func_globals', 'func_name']
>>> # But now let's put test_func on the class...
>>> A.test = test_func
>>> type(A.test)  # What type does this show?
<type 'instancemethod'>
>>> dir(A.test)  # And what does it have?
['__call__', '__class__', '__cmp__', '__delattr__', '__doc__', '__get__',
 '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__',
 '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'im_class',
 'im_func', 'im_self']
>>> # See, we just got a wrapper, and the function is in 'im_func'...
>>> getattr(A.test, 'im_func')
<function test_func at 0x0219F4B0>
>>> # Now to show bound vs. unbound methods...
>>> getattr(a.test, 'im_self') # Accessing it via the instance
<__main__.A object at 0x021AFBF0>
>>> # The instance is itself 'im_self'
>>> a.test()
7
>>> getattr(A.test, 'im_self') # Accessing it via the class returns None...
>>> print getattr(A.test, 'im_self')
None
>>> # It's unbound when accessed that way, so there's no instance in there
>>> # Which is why the following fails...
>>> A.test()

Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    A.test()
TypeError: unbound method test_func() must be called with A instance as
first argument (got nothing instead)
>>>

Und - Bearbeitung den folgenden zusätzlichen Ausgang hinzuzufügen, die auch relevant ist ...

>>> class B(object):
    pass

>>> b = B()
>>> b.test = test_func  # Putting the function on the instance, not class
>>> type(b.test)
<type 'function'>
>>> 

ich hinzufügen, werden nicht mehr ausgegeben, aber man könnte auch eine Klasse ein Attribut einer anderen Klasse oder Instanz machen, und, obwohl Klassen aufrufbar sind, würden Sie nicht ein Verfahren erhalten. Es werden Verfahren implementiert Nicht-Daten-Deskriptoren verwenden, so Deskriptoren nachschlagen, wenn Sie mehr Informationen zu wollen, wie sie funktionieren.

wird dieser Code-Schnipsel etwas nennen es in obj und speichern Ergebnisse in Abbildung finden, wo Schlüsselattributname ist - dict((k, v()) for (k, v) in obj.__dict__.iteritems() if k.startswith('something'))

Bearbeiten

Daniel, Sie sind falsch.

http://docs.python.org/reference/datamodel.html

  

Benutzerdefinierte Methoden

     

Eine benutzerdefinierte Methode Objekt kombiniert eine Klasse eine Klasseninstanz (oder   None) und jedes aufrufbare Objekt (normalerweise eine benutzerdefinierte Funktion).

Daher ist alles, was __call__ definiert und an einem Objekt angebracht ist, ist ein Verfahren.

Antwort

Der richtige Weg, um zu sehen, welche Elemente ein Objekt ist, das dir () Funktion zu verwenden.

Offensichtlich dieses Beispiel funktioniert nur für Funktionen, die keine Argumente übernehmen.

a=SomeTest()
for varname in dir(a):
    var = getattr(a, varname)
    if hasattr(var, "__call__"):
        var()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top