2013-05-16 6 views
5

Warum sollten Funktionen außerhalb der Klasse deklariert werden, in denen sie in Python verwendet werden?Was ist der Vorteil zu definieren, eine Funktion außerhalb der Klasse in Python-Programm

Zum Beispiel funktioniert die following project on Github dies mit seinen _hash, _task_from_taskline und _tasklines_from_tasks Funktionen. Das Format ist das gleiche wie die folgenden:

class UnknownPrefix(Exception): 
"""Raised when trying to use a prefix that does not match any tasks.""" 
def __init__(self, prefix): 
    super(UnknownPrefix, self).__init__() 
    self.prefix = prefix 


def _hash(text): 

    return hashlib.sha1(text).hexdigest() 

def _task_from_taskline(taskline): 
    """ 
    snipped out actual code 
    """ 
    return task 

def _tasklines_from_tasks(tasks): 
    """Parse a list of tasks into tasklines suitable for writing.""" 


    return tasklines 

Aber ich denke, diese Funktionen haben eine Beziehung mit der Klasse TaskDict.

Warum sie aus der Klasse setzen? Was ist der Vorteil, wenn sie außerhalb der Klasse deklariert werden?

+1

drehen Sie sich um: Statt Was wäre der Vorteil, sie in der Klasse zu setzen? –

+0

@MartijnPieters Verkapselung. –

+0

@GeorgeStocker: Was ist, wenn die Funktionen keinen Einfluss auf den Instanzstatus haben? –

Antwort

3

Die Stop Writing Classes PyCon Rede ist nicht genau zu diesem Thema enthält aber was ich bin fühlen Lektionen hier bezogen werden: im Grunde, die Idee ist, dass Klassen sind für Objekte zu schaffen. Alle Attribute, Instanzmethoden und Klassenmethoden sollten das Ziel des Erzeugens von Objekten oder des Funktionierens der Objekte unterstützen. Klassen sind nicht für Code-Organisation (unter dieser Theorie) - dafür sind Module da.

Dies ist eine sehr eigenwillige Strategie und nicht jeder stimmt mit ihm. Aber wenn Sie in diesem Zusammenhang an Ihr Beispiel denken, ist es klar, dass der Grund dafür, dass die Funktionen nicht Teil der Klasse sind, ist, dass obwohl die Funktionen von der Klasse verwendet werden, sie nicht auf irgendeinem Objekt oder der Erstellung operieren von jedem Objekt direkt. Sie sind nur Dienstprogrammfunktionen, die nicht an eine bestimmte Klasse gebunden sind und theoretisch an anderer Stelle in der Bibliothek verwendet werden könnten.

Warum oder warum sie nicht in der Klasse setzen? Es läuft darauf hinaus, ob Sie glauben, dass Klassen für die Code-Organisation verwendet werden sollten oder nicht. In diesem Fall hat der Autor anscheinend die Idee, dass es sich um Module handelt, die für die Code-Organisation gedacht sind, nicht für Klassen.

0

Regel bei der Entscheidung, wo Funktionen zu setzen ist es wichtig, zu erkennen, was die Funktionen verwenden wird. Wenn sie intern in der Klasse sind und nicht von anderen Teilen Ihres Programms verwendet werden, ist es sinnvoll, sie in die Klasse aufzunehmen. Aber wenn andere Teile sie am wahrscheinlichsten verwenden, sollten sie auf der Modulebene sein.

+0

Ja, ich habe gedacht, dass ich denke, dass die Funktionen zur Klasse gehören und nicht mit anderen Klassen verwendet werden. Also ich bezweifle, warum außerhalb der Klasse zu definieren – poleworld

1

Wenn die definierten Funktionen arbeiten alle auf Daten innerhalb des Objekts, wäre es nur sinnvoll, um die Funktionen der Ebene der Klassen zu kapseln. Wenn man sieht, wie die Klasse das einzige ist, was diese Funktionen aufruft, wäre es sinnvoll, diese in die Klasse zu schreiben.

Der einzige Vorteil von ihnen außerhalb der Klasse setzen, wenn Sie einen anderen Code haben, der diese Funktionen nutzen, die sich auf die Klasse nicht verwandt sind. Oder wenn Sie einige Hilfsfunktionen erstellen, die von anderen Modulen verwendet werden.

3
  1. Sie sind einfacher zu importieren und haben kürzeren Namen als Member-Funktionen
  2. Selbst wenn man sich in der Klasse setzen, sie werden wahrscheinlich sowieso ein Class/static sein.
  3. Pythonic-Code verwendet Duck-Typisierung; Eine Methode würde bedeuten, dass sie nur mit dieser Klasse verwendet werden kann, während der Code in Wirklichkeit eher generisch ist.
  4. Persönliche Präferenz. Manche Leute trennten gerne zwischen dem "Domänenmodell" und der "Geschäftslogik".

Am Ende für dieses spezielle Programm, gibt es wirklich keinen Vorteil noch Nachteil für beiden Richtungen zu tun.

+0

Ja, für mich. Ich werde sie in die Klasse setzen und als statische Methode definieren. – poleworld

1

Funktionen haben kleinen Leistungsvorteil

>>> import timeit 
>>> timeit.Timer('foo()', 'def foo(): return 1').timeit() 
0.09944701194763184 
>>> timeit.Timer('A.foo()', ''' 
... class A(object): 
...  @staticmethod 
...  def foo(): 
...   return 1''').timeit() 
0.12048101425170898 
Verwandte Themen