Подтвердить что ты не робот

Эквивалент JavaBean в Python

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

  • Реализует сериализуемое.
  • У получателей и сеттеров → частные свойства
  • конструктор dummy

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

4b9b3361

Ответ 1

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

  • Ни один serializable, ни "реализация интерфейса" не имеют смысла в Python (ну, в некоторых рамках и в расширенных случаях использования, но не здесь). Модули сериализации, такие как pickle, работают без реализации или наследования чего-либо специального (вы можете настроить этот процесс другими способами, но вам почти никогда не нужно к).
  • Вы не создаете геттеры и сеттеры. Вы просто используете публичные атрибуты. Если позже вам понадобится нетривиальный getter/setter, вы можете трансформировать его в property прозрачно.
  • Нет необходимости в конструкторе фиктивного типа, если вы не хотите создавать атрибуты и устанавливать для них значения по умолчанию. Но, вероятно, плохая идея (для класса bean -ish), поскольку не присвоение значений этим атрибутам, скорее всего, является ошибкой и сомнительной, даже если это не так. Так что пусть Python поймает эти ошибки для вас (он поднимает AttributeError, когда к нему невозможен доступ).

Ответ 2

Пример для конструктора 'chain':

>>> 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 имеют совершенно разные культуры, требуется некоторое время, чтобы погрузиться (и оценить) оба.

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

Ответ 3

Реализует сериализуемое.

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

Имеет геттеры и сеттеры → частные свойства

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

конструктор dummy

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

Ответ 4

Как указано miku:

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

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

  • Ничего добавить к ответу miku.

о свойствах: Пример реального мира о том, как использовать свойство свойства в python?

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

Ответ 5

Что ж, я думаю, что классы данных будут похожи на Java bean-компоненты, и что их использование на самом деле хорошая идея, так как это устраняет проблему.