Как Moose сравнивается с системой OO Python? - программирование
Подтвердить что ты не робот

Как Moose сравнивается с системой OO Python?

Мой первоначальный вопрос был слишком расплывчатым и был "закрыт как не конструктивный". Таким образом, я пересмотрю вопрос, чтобы он отвечал на ответы, которые уже были опубликованы.: -)

Меня интересуют различия между Perl Moose OO framework Moose и основой OO Python. Как первая точка сравнения, насколько легко создать простой класс с несколькими атрибутами и несколькими методами?

Теперь, если этот вопрос будет вновь открыт, я также хотел бы знать: насколько легко это сделать для кода рефакторинга в будущем, если я решу сделать атрибут "только для чтения"? Другими словами, какие шаги я должен предпринять, чтобы изменить атрибут, чтобы быть читаемым и доступным для записи только для чтения? (Я знаю, это плохо, чтобы изменить API, но позвольте предположить, что я над чем-то работаю и понимаю в середине моей реализации, что атрибут действительно должен быть доступен только для чтения.)

4b9b3361

Ответ 1

Из-за того, что оба они оба, Лось, большая сила - это краткость. Сравнить классический perl OO:

package Person;
use strict;
use warnings;

sub new {
  my $self = {};
  my $class = ref($proto) || $proto;
  $self->{FIRST_NAME} = undef;
  $self->{LAST_NAME} = undef;
  bless ($self, $class);
  return $self;
}

sub first_name {
  my $self = shift;
  if (@_) { $self->{FIRST_NAME} = shift }
  return $self->{FIRST_NAME};
}

sub last_name {
  my $self = shift;
  if (@_) { $self->{LAST_NAME} = shift }
  return $self->{LAST_NAME};
}

1;

с лосем:

package Person;
use Moose;
use namespace::autoclean;

has 'first_name' => (is  => 'rw', isa => 'Str',);
has 'last_name' => (is  => 'rw', isa => 'Str',);

__PACKAGE__->meta->make_immutable;
1;

И я в значительной степени продаю, но Муз только начинает. Я думаю, что моей следующей любимой особенностью была Types, которая могла бы действительно упростить программу на большой базе кода и остановить целый ряд неприятных ошибок. Например, было бы хорошо обработано то, что я укусил на днях (при кодировании Python, на самом деле), где определенное свойство объекта было Date в некоторых случаях, но строка, представляющая дату в других.

Не слышал о какой-либо альтернативной OO-системе для python.

Ответ 2

Сила Python OO, вероятно, находится в ее распространенности. То есть встроенная OO-система настолько проста и синтаксис настолько доступен, что далеко и далеко от доминирующей парадигмы программирования Python. Например, грубый эквивалент первого примера "Человек" Тодда Гарднера может работать так:

class Person:
    def __init__(self):
        self.firstname = None
        self.lastname = None

me = Person()
me.firstname = 'Kirk'  # These two lines update instance attributes
me.lastname = 'Strauser'

Эта версия определяет геттеры и сеттеры для доступа к значениям:

class AnotherPerson:
    def __init__(self):
        self._firstname = None
        self._lastname = None

    @property
    def firstname(self):
        return self._firstname

    @firstname.setter
    def firstname(self, newname):
        self._firstname = newname

    @property
    def lastname(self):
        return self._lastname

    @lastname.setter
    def lastname(self, newname):
        self._lastname = newname

you = AnotherPerson()
you.firstname = 'David'  # These two lines call instance methods
you.lastname = 'Mertens'

Python и Perl примерно эквивалентны по мощности, гибкости и выразительности. Если вы можете что-то сделать в одном, вы, вероятно, можете сделать это аналогично в другом. Тем не менее, я думаю, что Python имеет явное преимущество в простой OO-дизайне - до такой степени, что для каких-либо альтернативных объектных моделей не было причин для получения значительного сцепления.