Как Moose сравнивается с системой OO Python?
Мой первоначальный вопрос был слишком расплывчатым и был "закрыт как не конструктивный". Таким образом, я пересмотрю вопрос, чтобы он отвечал на ответы, которые уже были опубликованы.: -)
Меня интересуют различия между Perl Moose OO framework Moose и основой OO Python. Как первая точка сравнения, насколько легко создать простой класс с несколькими атрибутами и несколькими методами?
Теперь, если этот вопрос будет вновь открыт, я также хотел бы знать: насколько легко это сделать для кода рефакторинга в будущем, если я решу сделать атрибут "только для чтения"? Другими словами, какие шаги я должен предпринять, чтобы изменить атрибут, чтобы быть читаемым и доступным для записи только для чтения? (Я знаю, это плохо, чтобы изменить API, но позвольте предположить, что я над чем-то работаю и понимаю в середине моей реализации, что атрибут действительно должен быть доступен только для чтения.)
Ответы
Ответ 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-дизайне - до такой степени, что для каких-либо альтернативных объектных моделей не было причин для получения значительного сцепления.