2013-02-20 20 views
12

Jestem dość nowy, aby używać Pythona jako narzędzia OOP. Pochodzę z tła Java. Jak napisałbyś javabean odpowiednik w python? Zasadniczo potrzebuję klasy, która:Odpowiednik JavaBean w języku Python

  1. Implementuje serializable.
  2. Has pobierające i ustawiające -> Właściwości prywatne
  3. manekin konstruktora

Wszelkie wejść? Szukam przykładowego kodu!

+0

Dzięki wszystkim. Rozwiązuje moje zapytanie tutaj. – stealthspy

Odpowiedz

21

Nie, ponieważ Python is not Java. Najprawdopodobniej powinieneś po prostu napisać mniej banalną klasę, skonstruować namedtuple, przekazać słownik lub coś w tym stylu. Ale odpowiedź na pytanie:

  1. Ani serializable ani „Realizacja interfejsu” ma sens w Pythonie (no, w pewnych ram i zaawansowanych przypadków użycia to robi, ale nie tutaj). Moduły szeregowania, takie jak pickle, działają bez implementowania lub dziedziczenia niczego specjalnego (można dostosować proces w inny sposób, ale prawie nigdy nie trzeba).
  2. You don't write getters and setters. Po prostu korzystasz z atrybutów publicznych. Jeśli później będziesz wymagał nietrywialnego programu pobierającego/ustawiającego, możesz go przeźroczysto przekształcić w property.
  3. Nie ma potrzeby stosowania fałszywego konstruktora, chyba że chcesz utworzyć atrybuty i ustawić dla nich wartości domyślne. Ale to prawdopodobnie zły pomysł (dla klasy bean-ish), ponieważ nieprzypisywanie wartości do tych atrybutów jest najprawdopodobniej błędem i wątpliwym, nawet jeśli nie jest. Po prostu pozwól Pythonowi wychwycić te błędy (podnosi AttributeError, gdy dostęp do nieistniejącego atrybutu uzyskuje się).
+5

+1: Właśnie chciałem wspomnieć o tym artykule ("Python to nie Java"). –

+0

Lol, Właśnie opublikowałem link do artykułu ... – flaviotruzzi

+1

Dzięki. Próbowałem Pythona, a mój kod był o połowę mniejszy. Dzięki! Właśnie znalazłem wspaniały język. Byłem pod wpływem bańki, że Java była o wiele lepsza! – stealthspy

3
  1. Możesz serializować większość obiektów za pomocą modułu pickle;
  2. Nie ma takich rzeczy jak atrybutów prywatnych w Pythonie (patrz również:
  3. Klasy, które nie definiują konstruktora, będą używać wartości domyślnych (zgodnie z kolejnością rozwiązywania metody).

Przykład dla konstruktora 'łańcuch':

>>> class A(object): 
...  def __init__(self): 
...   print("A") 
...  
... 
>>> class B(A): pass # has no explicit contructor 
... 
>>> b = B() 
A 
>>> 

oraz - jako @delnan pisał - może chcesz przeczytać: http://dirtsimple.org/2004/12/python-is-not-java.html - Java i Python mieć zupełnie inny kultur, to zajmuje trochę czasu zanurz się w (i doceń) oba.

Również po wpisaniu kodu, może to być pomocne, aby porównać go do wspólnych idiomów, wymienione tutaj (ja na pewno wiele się nauczyłem ten sposób):

+0

Wielkie dzięki za odpowiedź. – stealthspy

1

Implementuje przetwarzanie seryjne.

Wybierz swój ulubiony format i napisz funkcję, która przygotuje go dla Ciebie. JSON, Pickle, YAML, każda praca. Po prostu decyduj!

Has pobierające i ustawiające -> Właściwości prywatne

Nie rób tego tutaj, to są atrybuty językach niewoli, jesteśmy wszyscy dorośli w tym języku.

manekin konstruktor

Znowu nie coś naprawdę martwić jak nasi konstruktorzy są trochę mądrzejsi od innych językach.Więc możesz po prostu zdefiniować jeden __init__ i może on wykonać całą twoją inicjalizację, jeśli musisz wtedy napisać fabrykę lub podklasę.

+1

Powiedziałbym, ręczne pisanie kodu do konwersji obiektów do iz JSON/YAML/etc. w większości przypadków nie jest ani konieczne, ani zalecane. – delnan

+0

A kiedy 'marynata' nie powinna być używana, ponieważ jest niepewna lub powolna, lub nie poradzi sobie z twoim fantazyjnym przedmiotem? –

+0

Jest to jeden z przypadków, w których alternatywy są dobre ;-) Chociaż spodziewam się, że w wielu takich przypadkach istnieje istniejące rozwiązanie do zautomatyzowania tego, więc nadal nie trzeba pisać kodu ręcznie. Ponadto w ostatnim przypadku zawsze możesz użyć 'copyreg' lub' __reduce__', aby dostosować sposób, w jaki pikle obsługuje twój wymyślny obiekt. – delnan

0

Jak wskazano przez Miku:

  1. Obiekty mogą być szeregowane przez moduł picke, ale nie jest to interfejs do realizacji, Python nie jest Java.

  2. Nie ma prywatnego atrybutu w pytonie, zwykle ludzie używają pręta (podkreślenie) jako atrybuty prywatne, ale można uzyskać do nich dostęp ze świata zewnętrznego. Przeciągacze i setery to strata czasu zarówno procesorów, jak i programistów.

  3. Nic dodać do odpowiedzi miku.

o właściwościach: Real world example about how to use property feature in python?

dobry tekst: http://dirtsimple.org/2004/12/python-is-not-java.html