2014-04-08 16 views
11

In Python erfordert das Definieren einer Funktion mit einer leeren Parameterliste einen Satz leerer Klammern. Das Definieren eines class mit der Standardoberklasse erfordert jedoch keine leere Klammer; eher sind diese optional und scheinen ungewöhnlich zu sein. Wieso ist es so?Warum sind Klammern beim Definieren einer Klasse optional, aber beim Definieren einer Funktion zwingend erforderlich?

Siehe auch: Python class definition syntax.

+2

Warum sollte es nicht so sein? Klassen sind keine Funktionen. Abstimmung zu schließen, weil ich denke, dass dies eine meinungsbasierte Frage ist. Ich bezweifle, dass es eine objektive Antwort gibt. –

+0

Ich bin an Bord, dass eine No-Args-Funktion keine leeren Klammern benötigen sollte, aber das ist meine Meinung und einfach nicht die Art, wie Python funktioniert. Andere Sprachen wie Ruby nehmen optional-Klammern bis zum Äußersten und es hat ... Vor- und Nachteile. – roippi

+1

[In 2005] (https://mail.python.org/pipermail/python-dev/2005-February/051712.html) waren leere Klammern nicht erlaubt. – kojiro

Antwort

9

Ich denke, die Antwort auf Ihre Frage ist einfach Syntax. Das ist nur die Art und Weise Python eingerichtet ist, aber mein nehmen, wie man es so geworden ist:

Ich Funktionen würde denken, kam aus der Mathematik Dinge wie:

f(x) = x 

Also, wenn Computer-Programmiersprachen wurden Dort entstanden scheint eine logische Kontinuität von der analogen Mathematik in Programmiersprachen gewesen.

Klassen auf der anderen Seite sind mehr Konstrukte der Informatik und repetitive Speicherverwaltung, so dass sie nicht auf diese Weise erstellt wurden, sondern weil sie eine funktionale Qualität zu ihnen haben, erhielten sie ähnliche Notation.

Für Python, werde ich den Begriff method für function verwenden wie die üblichen Kauderwelsch ist ...

Ich verstehe Ihr Argument, dass sowohl ein class und method sollte definiert werden, erlaubt werden, indem eine Abkürzung in das kein Argument Fall:

  • für class es, wenn es keine inheritence
  • für method s, wenn es keine Argumente

Ein Grund, an den ich denken kann, ist für Konsistenz über Verbrauch und Definition. Lassen Sie uns einige Beispiele an:

Definition:

def funcA(): 
    return 0 

def funcB(arg): 
    return arg 

und Sie wollen, dass funciton nennen:

>>> funcA() 
>>> functB("an argument") 

und

>>> f1 = funcA 
>>> f2 = funcB 
>>> f1() 
>>> f2("another argument") 

Referenzen übergeben und sie nennen.

Die Syntax der Paranthese zwischen method Deklaration ist konsistent mit dem Aufruf der methods.

Sie müssen diese leeren Klammern setzen, sonst wird der Interpreter Ihnen einen Verweis auf die method geben und nicht tatsächlich aufrufen.

So ein Vorteil ist es macht Ihren Code sehr klar.

Definition:

class classA: 
    pass 

class classB(object): 
    pass 

Nutzung:

# create an instance 
my_instance_of_A = classA() 
my_instance_of_B = classB() 

# pass a reference 
my_ref_to_A = classA 
my_ref_to_B = classB 

# call by reference 
new_A = my_ref_to_A() 
new_B = my_ref_to_B() 

Hier gibt es keine Änderung im Verhalten in Bezug auf, ob die class erbt oder nicht, wird sein Rufverhalten diktiert durch das, was seine internen oder geerbt __init__ Methode ist definiert als.

Ich denke, die aktuelle Einrichtung der Forderung nach dem leeren () macht den Code für das ungeübte Auge besser lesbar.

Wenn Sie wirklich wirklich wirklich wollen, zu tun, was Sie fragen, es eine Abhilfe ist ... Sie könnte dies immer tun:

func = lambda: "im a function declared with no arguments, and I didn't use parenthesis =p" 

, die aufgerufen werden können:

>>> func 
<function <lambda> at 0x6ffffef26e0> 
>>> func() 
"im a function declared with no arguments, and I didn't use parenthesis =p" 

Aber die python holy book says No

Verwandte Themen