2013-02-20 3 views
12

Я довольно новичок в использовании Python в качестве ООП. Я исхожу из фона Java. Как вы напишете javabean эквивалент в python? В принципе, мне нужен класс, который:эквивалент JavaBean в Python

  1. Реализует сериализуемый.
  2. Имеет добытчиками и сеттеры -> Частные свойства
  3. фиктивная конструктор

Все входы? Я ищу образец кода!

+0

Спасибо всем. Решает мой запрос здесь. – stealthspy

ответ

21

У вас нет, потому что Python is not Java. Скорее всего, вы должны просто написать менее тривиальный класс, построить namedtuple, передать словарь или что-то в этом роде. Но чтобы ответить на вопрос:

  1. Ни serializable, ни «реализующий интерфейс» имеет смысл в Python (ну, в некоторых рамках и сложных случаев использования это делает, но не здесь). Модули сериализации, такие как pickle, работают без реализации или наследования чего-либо специального (вы можете настроить этот процесс другими способами, но вам почти никогда не нужно).
  2. You don't write getters and setters. Вы просто используете публичные атрибуты. Если позже вам понадобится нетривиальный геттер/сеттер, вы можете превратить его в property прозрачно.
  3. Нет необходимости в создании конструктора фиктивных объектов, если вы не хотите создавать атрибуты и устанавливать для них значения по умолчанию. Но это, вероятно, плохая идея (для класса bean-ish), поскольку присвоение значений этим атрибутам, скорее всего, является ошибкой и сомнительной, даже если это не так. Так что пусть Python поймает эти ошибки для вас (он вызывает AttributeError при доступе несуществующего).
+5

+1: Я как раз собирался упомянуть эту статью («Python - не Java»). –

+0

Lol, Только что опубликовал ссылку на статью ... – flaviotruzzi

+1

Спасибо. Я попробовал Python, и мой код был в два раза меньше. Благодаря! Я просто нашел замечательный язык. Я был под пузырем, что Java была намного лучше! – stealthspy

3
  1. Вы можете сериализовать большинство объектов с помощью модуля pickle;
  2. Там нет таких вещей, как частных атрибутов в Python (смотрите также:
  3. Классы, которые не определяют конструктор, будут использовать значение по умолчанию (в соответствии с порядком разрешения метода).

Пример конструктора 'цепи':

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

и - как @delnan писал - вы можете прочитать: http://dirtsimple.org/2004/12/python-is-not-java.html - Java и Python имеют совершенно разные культуры, это занимает некоторое время погрузитесь в (и оцените) оба.

Кроме того, после написания какой-то код, это может быть полезно сравнить его с общими идиомы, как указано здесь (я, конечно, узнал много этот путь):

+0

Большое спасибо за ответ. – stealthspy

1

Осуществляет сериализуемость.

Выберите свой любимый формат и напишите функцию, которая будет сериализовать ее для вас. JSON, Pickle, YAML, любая работа. Просто решите!

имеет методы получения и установки -> личные свойства

Мы не делаем здесь, это те атрибуты языков неволи, мы все взрослые люди на этом языке.

фиктивная конструктор

Опять не то, что мы на самом деле беспокоиться о том, как наши конструкторы немного умнее, чем другие языки.Таким образом, вы можете просто определить один __init__, и он может выполнить всю вашу инициализацию, если вы должны затем написать фабрику или подкласс.

+1

Я бы сказал, что вручную написание кода для преобразования объектов в JSON/YAML и т. Д. И т. Д. не является ни необходимым, ни целесообразным в большинстве случаев. – delnan

+0

И когда 'pickle' не следует использовать, потому что его небезопасно или медленно, или он не может справиться с вашим воображаемым объектом? –

+0

Это один из случаев, когда альтернативы в порядке ;-) Хотя я ожидаю, что во многих таких случаях существует существующее решение для автоматизации этого, поэтому вам все равно не нужно писать код вручную. Кроме того, в последнем случае вы всегда можете использовать 'copyreg' или' __reduce__', чтобы настроить, как pickle обрабатывает ваш фантастический объект. – delnan

0

Как указан на Мику:

  1. Объектов могут быть сериализовать модуль picke, но не интерфейс будет реализовано, Python не Java.

  2. В python нет частного атрибута, обычно люди используют бар (подчеркивание), чтобы обозначать частные атрибуты, но к ним можно получить доступ из внешнего мира. Getters и seters - пустая трата времени как для CPU, так и для программистов.

  3. Ничего не добавлено в ответ miku.

о свойствах: Real world example about how to use property feature in python?

хороший текст: http://dirtsimple.org/2004/12/python-is-not-java.html