Ich weiß, was Doppel-Unterstrich für Python-Klasse Attribute/Methoden bedeutet, aber bedeutet es etwas für Methode Argument?Doppelter Unterstrich für Python-Methode * Argument *
Es sieht so aus, als ob Sie kein Argument übergeben können, das mit einem doppelten Unterstrich zu Methoden beginnt. Es ist verwirrend, weil Sie das für normale Funktionen tun können.
Betrachten Sie dieses Skript:
def egg(__a=None):
return __a
print "egg(1) =",
print egg(1)
print
class Spam(object):
def egg(self, __a=None):
return __a
print "Spam().egg(__a=1) =",
print Spam().egg(__a=1)
dieses Skript Ausbeuten Laufen:
egg(1) = 1
Spam().egg(__a=1) =
Traceback (most recent call last):
File "/....py", line 15, in <module>
print Spam().egg(__a=1)
TypeError: egg() got an unexpected keyword argument '__a'
ich diese 2.7.2 mit Python überprüft.
Einige andere Beispiele
Dies funktioniert:
def egg(self, __a):
return __a
class Spam(object):
egg = egg
Spam().egg(__a=1)
Dies gilt nicht:
class Spam(object):
def _egg(self, __a=None):
return __a
def egg(self, a):
return self._egg(__a=a)
Spam().egg(1)
Wenn es passiert „unabhängig davon, wo sie auftreten“, erwarte ich das letzte Beispiel (die, die ich hinzugefügt) arbeitet. Ich denke, ich weiß, warum es nicht so ist; es sollte im "Class Namespace" oder so ähnlich sein (ich weiß nicht, was das richtige Wort dafür ist), oder? – tkf
Das würde ich auch erwarten und bin ziemlich überrascht. Ich denke, es ist ein Fehler in der Dokumentation oder der Implementierung. Ich bearbeite gerade, um meine Ergebnisse hinzuzufügen. – delnan
Ich stimme zu, dass es kein eleganter Parameter ist, aber bedenken Sie, wenn Sie etwas wie 'self .__ dict __. Update (kwds)' in der Funktion haben, aber das Verhalten der Funktion steuern wollen. Der einzige gültige Argumentname, den ich mir vorstellen kann, um das Verhalten zu steuern, ist der mit einem doppelten Unterstrich. – tkf