我最初的问题太模糊了,而且是“封闭的,没有建设性的”。因此,我将修改问题,使其迎合已经发布的答案。:-)
我感兴趣的是Perl的Moose OO框架Moose和Python的普通OO框架之间的区别。作为第一个比较点,创建一个只有几个属性和几个方法的简单类有多容易?
现在,如果这个问题重新开始,我也想知道:如果我决定将一个属性设置为“只读”,那么将来重构代码有多容易?换句话说,我必须采取哪些步骤才能将属性从可读和可写更改为只读?(我知道更改API很糟糕,但让我们假设我在内部处理一些事情,并且在实现过程中意识到属性实际上应该是只读的。)
发布于 2012-02-08 10:55:36
通过使用两者,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;
使用Moose:
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,它可以真正简化一个程序而不是一个大的代码库,并阻止一系列令人讨厌的bug。例如,它可以很好地处理前几天我被咬到的对象(实际上是在编写Python时),其中对象的某个属性在某些情况下是日期,但在另一些情况下是代表日期的字符串。
我还没有听说过任何替代的python面向对象系统。
发布于 2012-02-08 12:28:31
Python面向对象的优势可能在于它的普遍性。也就是说,内置的OO系统非常简单,语法也非常容易接近,因此它无疑是占主导地位的Python编程范例。例如,Todd Gardner的第一个"Person“示例的粗略等价物可能如下所示:
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在简单的OO设计中有明显的优势--以至于没有理由让任何替代的对象模型获得巨大的吸引力。
https://stackoverflow.com/questions/9186776
复制相似问题