praktiska exempel
i Python tillåter iteration oss att gå över en lista med objekt för att utföra särskilda operationer. Ett vanligt sätt att skapa en iteration är att använda looparna for
, som har följande allmänna format.
for i in iterable:
expression
som diskuterats i min tidigare artikel kan vi skapa våra anpassade iteratorer som kan användas som iterables i looparna for
. För att tillfredsställa ”duck testing” för iteratorer måste den anpassade klassen implementera metoderna __iter__()
och __next__()
. Ett specifikt exempel ges nedan.
i ovanstående kodavsnitt implementerade vi både __iter__()
och __next__()
metoder som gör instanserna av den anpassade klassen Cubes
iteratorer, så att instansen kunde användas i en for
slinga.
Callables
förutom den inbyggda datatypen dict
är en annan viktig ordbokstyp defaultdict
, tillgänglig i modulen collections
. Denna ordboksliknande datatyp har följande konstruktör: defaultdict(])
. Specifikt är argumentet default_factory
en typ av anropbar, till exempel en funktion eller lambda-funktion.
i min tidigare artikel visade jag att vi kunde använda defaultdict
genom att skicka en lambda-funktion. Här är exemplet på dess användning.
>>> from collections import defaultdict
>>> letter_counts = defaultdict(lambda: 0)
>>> for i in 'abcddddeeeee':
... letter_counts += 1
...
>>> letter_counts.items()
dict_items()
i synnerhet kan vi ha bättre flexibilitet att använda datatypen defaultdict
om vi skapar vår egen standardfabrik. Med” duck typing ” – filosofin måste den anpassade klassen implementera __call__()
– metoden, vilket är att göra något som kan ringas. Låt oss se hur det fungerar.
som visas i ovanstående kod skapar vi klassen DucklingFactory
, vars __call__()
funktion returnerar en lista med en Duckling
instans. Med den här fabriksfunktionen kan vi göra önskat antal ankungar genom att multiplicera standard ankungslistan.
sortering med Len ()
en annan möjlig användning av duck typing är att implementera den anpassade len()
– funktionen, som kan användas för att sortera en lista med funktionen sort()
. Som en sidoanteckning hänvisar vissa till funktionen len()
som en magisk funktion, eftersom den implementeras genom att ringa funktionen __len__()
bakom scenen (de funktioner med dubbla understreck som prefix och suffix kallas magiska funktioner).
Antag att vi vill sortera en lista med ankor baserat på längden på namnet på varje anka. Så här kan vi tillämpa duck typing i det här fallet.
i ovanstående kodavsnitt implementerar den anpassade NamedDuck
klassen funktionerna __str__()
och __len__()
, vilket gör att vi kan använda funktionerna str()
och len()
på dess instanser i raderna 10 respektive 12. Viktigt, som du kan se, även om listan blandas med namngivna ankor och strängar, kan alla element anropa funktionerna str()
och len()
, så att listan kan sorteras med len()
som nyckel och användas i listförståelsen när vi vill skriva ut det sorterade resultatet.
Således är den bredare implikationen av denna användning att när vi har en blandad lista över element av olika datatyper, så länge som varje datatyp implementerar samma funktioner, kommer elementen att passera duck-testningen och tillämpas med rätt operationer. Här är ett exempel på allmänt användningsfall med funktionen len () på en blandad lista med datatyper str
, tuple
och list
.
>>> mixed_list = ]
>>> mixed_list.sort(key=len)
>>> mixed_list
, (1, 2), 'Amazing']