Numer generic function jest wywoływany na podstawie typu wszystkich jego argumentów. Programista określa kilka implementacji funkcji. Prawidłowy jest wybierany w czasie połączenia w oparciu o typy jego argumentów. Przydaje się to między innymi do adaptacji obiektów. Python ma kilka ogólnych funkcji, w tym len()
.Jakie są najlepiej utrzymane implementacje funkcji ogólnych dla Pythona?
Pakiety te mają tendencję, aby umożliwić kod, który wygląda tak:
@when(int)
def dumbexample(a):
return a * 2
@when(list)
def dumbexample(a):
return [("%s" % i) for i in a]
dumbexample(1) # calls first implementation
dumbexample([1,2,3]) # calls second implementation
Mniej głupi przykład myślałam o ostatnio byłby składnikiem internetowa, która wymaga od użytkownika. Zamiast wymagające szczególnej ramy internetową, integrator po prostu trzeba napisać coś takiego:
class WebComponentUserAdapter(object):
def __init__(self, guest):
self.guest = guest
def canDoSomething(self):
return guest.member_of("something_group")
@when(my.webframework.User)
componentNeedsAUser(user):
return WebComponentUserAdapter(user)
Python ma kilka rodzajowe funkcje implementacje. Dlaczego wybrałbym jedną nad innymi? W jaki sposób ta implementacja jest używana w aplikacjach?
Jestem zaznajomiony z Zope's zope.component.queryAdapter(object, ISomething)
. Programista rejestruje adapter do wywołania, który przyjmuje jako argument określoną klasę obiektu i zwraca coś kompatybilnego z interfejsem. Jest to przydatny sposób na włączenie wtyczek. W przeciwieństwie do łatania małp, działa nawet wtedy, gdy obiekt musi się dostosować do wielu interfejsów o tych samych nazwach metod.
Funkcja 'len' po prostu wywołuje metodę' __len__' obiektu. Czy to masz na myśli funkcję "rodzajową"? Jeśli tak, istnieje stosunkowo niewiele funkcji, które zachowują się w ten sposób. Czy masz coś innego na myśli? Jeśli tak, wybierz lepszy przykład. –
Czy mówisz o polimorfizmie? A może mówisz o poprawianiu małp istniejących typów, aby dodać polimorfizm? –
wydaje się, że (w oparciu o link? I wikipedia) joeforker chce zaimplementować przeciążone funkcje. Wierzę, że odnosi się do "generycznego" w tym sensie, że funkcja jest wywoływana przez 1 nazwę, ale wykonuje inny kod na podstawie przekazanych parametrów. Zatem: My_function (a) -> execute function_a My_function (b) -> execute function_b Jest to bardziej stylowe realizacja analizowania ** kwargs dostać których kod do wykonania – Mark