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

时间:2012-02-08 01:49:45

标签: python perl oop moose

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

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

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

2 个答案:

答案 0 :(得分:11)

从使用过两者之后,穆斯的强大优势就在于它的简洁。比较经典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;

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

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

答案 1 :(得分:3)

Python的OO优势可能在其普及性上。也就是说,内置的OO系统非常简单,语法非常平易近人,它远远超出了主流的Python编程范例。例如,Todd Gardner的第一个“人物”示例的粗略等效可能类似于:

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'

此版本定义了用于访问值的getter和setter:

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在简单的面向对象设计中具有明显的优势 - 至于没有理由让任何替代对象模型获得显着的牵引力。