2016-03-25 13 views
1

Was ist die Logik für die Auswahl einiger Methoden, denen die Elemente vorangestellt werden, mit denen sie verwendet werden, aber einige Funktionen, die Elemente als Argumente benötigen? Zum Beispiel:Python: item.method() und function (item)

L=[1,4,3]  
    print len(L) #function(item) 
    L.sort() #item.method()    

Ich dachte, vielleicht die Funktionen, die das Element ändern müssen vorangestellt werden, während diejenigen, die Informationen über das Element verwenden Sie es als Argument zurück, aber ich bin mir nicht sicher.

Edit:

Was ich versuche ist, zu fragen, warum nicht Python L.len() haben? Was ist der Unterschied zwischen den beiden Arten von Funktionen? Oder wurde zufällig gewählt, dass einige Operationen Methoden sind, während andere Funktionen sein werden?

Antwort

2

Eines der Prinzipien, die hinter Python ist There is Only One Way to Do It. Um die Länge einer Sequenz (array/tuple/xrange ...) zu erhalten, verwenden Sie immer len, unabhängig vom Sequenztyp.

Die Sortierung unterstützt jedoch nicht alle Sequenztypen. Dies macht es besser geeignet, eine Methode zu sein.

a = [0,1,2] 
b = (0,1,2) 
c = xrange(3) 
d = "abc" 

print len(a), len(b), len(c), len(d) # Ok 

a.sort() # Ok 
b.sort() # AttributeError: 'tuple' object has no attribute 'sort' 
c.sort() # AttributeError: 'xrange' object has no attribute 'sort' 
d.sort() # AttributeError: 'str' object has no attribute 'sort' 
+0

Vielen Dank! Ich denke, das macht Sinn. Ich suche nach etwas allgemeinerem, nicht beschränkt auf das Beispiel, das ich in die Frage gestellt habe. – Tinkidinki

+0

Oh k, ich denke, ich habe es: ist das richtig: Operationen, die die gleiche innere Ebene Codierung für jeden Datentyp erfordern, sind Funktion (Element), aber diejenigen, die für den Datentyp spezifisch sind item.method(), richtig? – Tinkidinki

1

Etwas, das Sie verstehen etwas besser helfen kann: http://www.tutorialspoint.com/python/python_classes_objects.htm

Was Sie beschreiben, wie item.function() ist eigentlich eine Methode, die von der Klasse definiert wird, dass die item gehört. Sie müssen ein umfassendes Verständnis von function, class, object, method und vielleicht mehr in Python bilden.

nur konzeptionell gesagt, wenn Sie L.sort(), die sort() Methode vom Typ/Klasse list nimmt vereinbarungs self, die das Objekt/Instanz des Typs/Klasse list, L stellt in diesem Fall in der Regel genannt ein Argument tatsächlich nennen. Und sort wie eine eigenständige sorted Funktion, sondern wendet nur die Sortierlogik auf L es self. Im Vergleich dazu würde die sorted-Funktion ein iterables (z. B. list) erfordern, um das erforderliche Argument zu sein, um zu funktionieren.

Code-Beispiel:

my_list = [2, 1, 3] 

# .sort() is a list method that applies the sorting logic to a 
# specific instance of list, in this case, my_list 
my_list.sort() 

# sorted is a built-in function that's more generic which can be 
# used on any iterable of Python, including list type 
sorted(my_list) 
+0

Ups ... Ich werde das zur Methode ändern. Ich denke, ich muss meine Frage klarer stellen. – Tinkidinki

+2

Ich möchte darauf hinweisen, dass 'len (L)' ein Sonderfall ist, obwohl es eine Funktion ist, es ist im Grunde Syntax Sugar für einen Methodenaufruf, insbesondere etwas wie 'return L .__ len __()' – Dleep

+0

@Emisor ja. Ich würde das in der Antwort erwähnen, aber ich denke, es könnte OP überwältigen. Aus diesem Grund habe ich nur ein sehr hochrangiges Konzept zu diesem Thema vorgelegt. – woozyking

0

Es gibt einen größeren Unterschied zwischen Methoden und Funktionen als nur ihre Syntax.

def foo(): 
    print "function!" 

class ExampleClass(object): 
    def foo(self): 
     print "method!" 

In diesem Beispiel definiert i eine Funktion foo und eine Klasse ExampleClass mit 1 Methode, foo. Lassen Sie uns versuchen, sie zu nutzen:

>>> foo() 
function! 
>>> e = ExampleClass() 
>>> e.foo() 
method! 
>>> l = [3,4,5] 
>>> l.foo() 

Traceback (most recent call last): 
    File "<pyshell#7>", line 1, in <module> 
    l.foo() 
AttributeError: 'list' object has no attribute 'foo' 
>>> 

Auch wenn beide den gleichen Namen haben, weiß Python, dass, wenn Sie foo() ausführt, Ihr Aufruf einer Funktion, so wird es prüfen, ob jede Funktion gibt es mit diesem Namen definiert .

Und wenn Sie ein tun.foo(), es weiß, dass Sie eine Methode aufrufen, also wird es prüfen, ob es eine Methode foo für Objekte des Typs a hat, und wenn es so ist, wird es aufgerufen. Im letzten Beispiel versuchen wir das mit einer Liste und es gibt uns einen Fehler, weil Listen keine foo Methode definiert haben.

Verwandte Themen