2016-07-15 1 views
1
def __init__(self, *args, **kwargs): 
    a=[args,kwargs] 
    print args 
    print type(args) 
    print type(kwargs) 
    print a 
__init__(1,2,3,4,5) 

Ausgang -Was ist der Grund, warum ich nicht alle Elemente im Tupel bekomme, wenn ich Args drucke? Hier args [0] druckt 2 statt 1

(2, 3, 4, 5) 
<type 'tuple'> 
<type 'dict'> 
[(2, 3, 4, 5), {}] 

Wo 1 aus dem Tupel args gehen? Auf Druckargumenten sollte es zurückgegeben werden (1,2,3,4,5) anstelle von (2,3,4,5)

+5

1 ging an 'self' seit' __init__' nicht eingeschaltet ist eine Klasse. – mgilson

Antwort

1

In diesem Fall würde self wie jedes andere Argument übergeben werden, da __init__ nicht gebunden ist jede Klasseninstanz. self dauert 1.

Beachten Sie, dass self nur eine Konvention zum Benennen von Klasseninstanzen im Klassenhauptteil ist und keine besondere Bedeutung hat, wenn sie außerhalb des Hauptteils einer Klasse oder Methode verwendet wird. Es ist nur ein Name.

Sie sollten auch vermeiden, ___thisnotation__ mit nicht speziellen Methoden zu verwenden, um Mehrdeutigkeiten zu vermeiden.

__init__ sollte daher im Körper einer Klasse definiert werden:

class MyClass: 
    def __init__(self, *args, **kwargs): 
     a=[args,kwargs] 
     print args 
     print type(args) 
     print type(kwargs) 
     print a 
2

Andere Antworten richtig sind, aber vielleicht wird dies besser erklären:

def foo(bar, *args): 
    print('Bar is {bar}'.format(bar=bar)) 
    print('args is {args}'.format(args=args)) 

foo(1, 2, 3, 4, 5) 

# Output: 
# Bar is 1 
# args is (2, 3, 4, 5) 

Das verwirrende Teil ist, dass Sie den Namen Ihrer Funktion __init__ und nannte den ersten Parameter self. Diese Namen sind in Klassenkonstruktoren üblich, und wenn Sie einen Konstruktor (oder eine beliebige Methode für ein Objekt) aufrufen, gibt es einen zusätzlichen ersten Parameter, der auf das Objekt zeigt. So würde dieser Code tun, was Sie erwarten:

class Foo(object): 
    def __init__(self, *args): 
     print(args) 

foo = Foo(1, 2, 3, 4, 5) 

# Output: 
# (1, 2, 3, 4, 5) 
1

Sie könnten Ihre Methode in einer Klasse bleiben und die erwartete Ausgabe:

class Example: 
    def __init__(self, *args, **kwargs): 
     a=[args,kwargs] 
     print args 
     print type(args) 
     print type(kwargs) 
     print a 

Example(1,2,3,4,5) 
Verwandte Themen