我原来的问题太模糊了,“因为没有建设性而被关闭”。因此,我将修改问题,以便迎合已经发布的答案。 : - )
我对Perl的Moose OO框架Moose和Python的股票OO框架之间的差异感兴趣。作为第一个比较点,创建一个包含几个属性和一些方法的简单类是多么容易?
现在,如果重新打开这个问题,我也想知道:如果我决定将属性设为“只读”,将来重构代码有多容易?换句话说,我需要采取哪些步骤来将属性从可读写更改为只读? (我知道,更改API是不好的,但我们假设我正在内部工作,并在实现过程中意识到属性确实应该是只读的。)
答案 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)
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在简单的面向对象设计中具有明显的优势 - 至于没有理由让任何替代对象模型获得显着的牵引力。