Po prostu zaczynam od Pythona i próbuję wymyślić właściwy sposób korzystania z klas.

Mój program ma obecnie dwie klasy, zadzwoń do nich Planner i Model. Planner jest model-agnostyk, biorąc pod uwagę, że używa dowolnego Model przedstawia spójny interfejs. Wygląda na to, że jeśli chcę mieć kilka różnych dostępnych modeli, powinny one odziedziczyć z coś , aby egzekwować spójny interfejs. Dodatkowo niektóre klasy modelu będą udostępniać funkcjonalność. Na przykład model SingleAgent może symulować jeden środek, podczas gdy model doubleAgent symulował dwa środki, każda zachowuje się jak Singleagent.

Więc - jak powinienem wdrożyć to / jakie funkcje językowe potrzebuję?

Edytuj: Dzięki za szybkie odpowiedzi prostując mnie o klasach kaczków! Więc brzmi, jakbym użyłby tylko dziedziczenia, jeśli chciałem zastąpić podzbiór innego {X0}} "s funkcjonalności? (I dla mojego dubbarea, prawdopodobnie użyłbym singleagents jako członków klasy?)

Przeglądałem kilka innych pytań z podobnymi tagami, ale wydają się być bardziej zaniepokojone składniami, a nie wybórami projektowymi. Spojrzałem również na oficjalną dokumentację Pythona na klas i nie znaleziono tego, co jestem szukam. (Prawdopodobnie dlatego, że nie wiem wystarczająco dużo, by go rozpoznać).

2
user670416 10 październik 2011, 01:00

3 odpowiedzi

Najlepsza odpowiedź

W Pythonie zazwyczaj nie używasz zupełnie tych samych podejść do OOP jak w językach statycznie. W szczególności nie potrzebujesz obiektu, aby zaimplementować określony interfejs lub czerpać z abstrakcyjnej klasy bazowej i tak dalej. Raczej ten obiekt musi być w stanie do wymagane operacje. Jest to potocznie znany jako wpisanie kaczki. Jeśli idzie jak kaczka i rozmawia jak kaczka, do wszystkich intencji i celów to kaczka.

Więc zdecyduj, jakie metody są wymagane dla obiektów i upewnij się, że zawsze je mają. Jeśli chcesz udostępnić wdrożenie między różnymi podmiotami w swoim systemie, możesz rozważyć dziedzictwo klasy. Ale jeśli nie, możesz jako dobrze wdrożyć hierarchie klasowe rozłączne.

3
David Heffernan 9 październik 2011, 21:11

Jeden z mocnych działów Pythona (i, jak wielu kłóci się, słabości) jest to, że nie polega na kontrolowaniu typu kompilacji, aby egzekwować interfejsy. Oznacza to, że jest to nie Wymagane dla zestawu obiektów dziedziczy ze wspólnej klasy bazowej, aby mieć ten sam interfejs - nadal mogą być używane zamiennie w każdej funkcji. To zachowanie jest powszechnie znane jako Duck wpisując.

W rzeczywistości, ponieważ python jest dynamicznie wpisany, trudno byłoby do "egzekwowania spójnego interfejsu", jak powiedziałeś. Z tego powodu rzeczy takie jak Zope.interface zostały utworzone. Główną korzyścią otrzymasz z klas w twoim przypadku, jest ponowne użycie kodu - jeśli wszystkie typy Model wdrażają pewne wspólne zachowanie.

Aby wziąć to jeszcze jeden krok dalej, jeśli powinieneś mieć niezwiązany typ obiektu w bibliotece osób trzecich z kontrolki, którą chcesz użyć jako Model, możesz nawet zrobić to, co nazywa się " Monkey Patching "lub" Duck Packing " Aby dodać kod niezbędny do podania interfejsu {X1}}!

2
Nate 9 październik 2011, 21:12

Zasadniczo link podany na zajęciach w Pythonie odpowiada na wszystkie pytania w sekcji o dziedzictwie. W twoim przypadku wystarczy zdefiniować klasę o nazwie model, a następnie dwie podklasy: SingleAgent und DoubleAgent:

class Model:
    pass

class singleAgent(Model):
    pass

Jeśli naprawdę, naprawdę potrzebujesz lekcji abstrakcyjnych, spójrz na "abstrakcyjną klasę bazową" ES: http: // docs.Python.org/library/abc.html.

0
radkappe 9 październik 2011, 21:22