Moose与Python的面向对象系统比较如何?
我最开始的问题太模糊了,被认为没有建设性而被关闭了。所以我会重新修改问题,让它更符合已经发布的回答。:-)
我想了解Perl的Moose面向对象框架 Moose 和Python自带的面向对象框架之间的区别。作为第一个比较点,创建一个简单的类,里面有几个属性和一些方法,难易程度如何呢?
如果这个问题能够重新开放,我还想知道:如果将来我决定把某个属性设为“只读”,那么重构代码有多简单?换句话说,我需要采取什么步骤才能把一个属性从可读可写改为只读?(我知道,改变API是不好的,但假设我在做内部项目时,突然意识到某个属性其实应该是只读的。)
2 个回答
3
Python的面向对象编程(OO)的强大之处在于它的普遍性。也就是说,Python内置的面向对象系统非常简单,语法也很容易上手,因此它成为了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'
这个版本定义了获取和设置值的方法:
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在简单的面向对象设计上有明显的优势,以至于没有其他的对象模型能够获得广泛的认可。
11
使用过这两种方式后,我觉得Moose最大的优点就是它简洁。我们来对比一下经典的Perl面向对象编程:
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吸引了,但它才刚刚开始。我下一个最喜欢的功能是类型,这个功能可以让大型程序变得更简单,还能避免很多麻烦的错误。例如,前几天我在写Python的时候就遇到了一个问题:一个对象的某个属性在某些情况下是日期类型,但在其他情况下却是表示日期的字符串。
我还没听说过Python有其他的面向对象系统。