Moose与Python的OO系统相比如何?

Dav*_*ens 17 python oop perl moose

我原来的问题太模糊了,"因为没有建设性而被封闭".因此,我将修改问题,以便迎合已经发布的答案.:-)

我对Perl的Moose OO框架Moose和Python的股票OO框架之间的差异感兴趣.作为第一个比较点,创建一个包含几个属性和一些方法的简单类是多么容易?

现在,如果重新打开这个问题,我还想知道:如果我决定将属性设置为"只读",将来重构代码有多容易?换句话说,我需要采取哪些步骤来将属性从可读写更改为只读?(我知道,更改API是不好的,但我们假设我正在内部工作,并在实现过程中意识到属性确实应该是只读的.)

Tod*_*ner 11

从使用过两者之后,Moose的强大优势在于它的简洁性.比较经典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;
Run Code Online (Sandbox Code Playgroud)

与穆斯:

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;
Run Code Online (Sandbox Code Playgroud)

而且我已经卖得很多,但是Moose才刚刚起步.我认为我的下一个最喜欢的功能是类型,它可以真正简化大型代码库上的程序,并阻止一系列令人讨厌的错误.例如,它可以很好地处理我前几天被咬过的一个(实际上是编码Python),其中对象的某个属性在某些情况下是Date,但是在其他实例中是一个表示日期的字符串.

没有听说过python的任何替代OO系统.

  • @jdi废话,特别是考虑到Perl和Python的基本OO模型*相同*,而Python的'属性'例如是游戏后期添加的事后补充,Python曾经有过DFS MRO,后来改装了C3等等. (8认同)
  • @jdi - 我起初实际上写了类似的东西,但我删除了它,因为比较两者,IMO,Moose远远领先于股票python OO,比如输入属性和枚举(但这可能只是我对静态的偏见)打字.) (6认同)
  • @jdi - "Perl的OO更像是事后的想法." 你重复了许多人在无知中所说的话.如果你对Perl的OO没什么好说的话,那么如果你能保持观望,我将不胜感激. (6认同)
  • 大卫,如果我的文本被重复,那是由于用户输入错误而不是无知.不需要粗鲁.我也没有暗示驼鹿或者perl是劣等的.我简单地说,python的替代OO系统似乎没有问题. (3认同)
  • 是大卫我同意你可以在没有扩展或包装的情况下编写perl OO,是的,我对perl的经验很少.我的评论是基于我所解释的普遍共识,直到驼鹿一直是一团糟.而且,我在这里唯一真实的陈述是关于python不需要备用的OO解决方案.让我们不要挑剔并开始perl python火焰战 (3认同)
  • @DavidMertens你欠jdi道歉.对于Perl来说,OO是一个事后的想法,尽管很久以前就出现了它,它似乎不再是它了.在添加对象之前我使用了Perl(它们出现在Perl 5中).不要那么防守.虽然他可能错过了Perl _requiring_ wrappers来做OO,但这并不夸张:"本土"Perl并没有强调这种编程风格.我不是以任何方式反Perl - 我选择做一个大学高级论文 - 但我怀疑拉里会非常不同意jdi的观点. (2认同)