2016-07-31 12 views
0

Gibt es eine Konvention, wie man sowohl eine Methode als auch eine Funktion hat, die dasselbe tun (oder überhaupt tun)?Haben Sie eine Methode und eine Funktion, die dasselbe tun?

Betrachten wir zum Beispiel

from random import choice 
from collections import Counter 

class MyDie: 
    def __init__(self, smallest, largest, how_many_rolls): 
     self.min = smallest 
     self.max = largest 
     self.number_of_rolls = how_many_rolls 

    def __call__(self): 
     return choice(range(self.min, self.max+1)) 

    def count_values(self): 
     return Counter([self() for n in range(self.number_of_rolls)]) 

def count_values(randoms_func, number_of_values): 
    return Counter([randoms_func() for n in range(number_of_values)]) 

wo count_values ist sowohl ein Verfahren und eine Funktion.

Ich denke, es ist schön, die Methode zu haben, weil das Ergebnis "gehört" zu dem MyDie-Objekt. Außerdem kann das Verfahren Attribute aus dem Objekt MyDie ziehen, ohne sie an count_values weiterleiten zu müssen. Auf der anderen Seite ist es schön, die Funktion, um auf andere Funktionen als MyDie, wie

count_values(lambda: choice([3,5]) + choice([7,9]), 7) 

ist es am besten zu funktionieren haben diese, wie oben zu tun (wo der Code wiederholt wird, übernehmen die Funktion eine längere Stück Code, nicht nur eine Zeile) oder die count_values Methode mit

def count_values(self): 
    return count_values(self, number_of_rolls) 

oder dem Verfahren erhält ersetzen alle zusammen los und nur eine Funktion haben? Oder vielleicht noch etwas?

Antwort

0

Hier ist eine Alternative, die es Ihnen noch erlaubt, die Logik in MyDie zu kapseln. Erstellen Sie eine Klassenmethode in MyDie

@staticmethod 
def count_specified_values(random_func, number_of_values): 
    return Counter([randoms_func() for n in range(number_of_values)]) 

Sie auch zusätzliche formale Parameter an den Konstruktor mit Standardwerten hinzufügen könnte, die Sie außer Kraft setzen könnten die gleiche Funktionalität zu erreichen.