首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Moose与Python的OO系统相比如何?

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

Stack Overflow用户
提问于 2012-02-08 09:49:45
回答 2查看 2K关注 0票数 17

我最初的问题太模糊了,而且是“封闭的,没有建设性的”。因此,我将修改问题,使其迎合已经发布的答案。:-)

我感兴趣的是Perl的Moose OO框架Moose和Python的普通OO框架之间的区别。作为第一个比较点,创建一个只有几个属性和几个方法的简单类有多容易?

现在,如果这个问题重新开始,我也想知道:如果我决定将一个属性设置为“只读”,那么将来重构代码有多容易?换句话说,我必须采取哪些步骤才能将属性从可读和可写更改为只读?(我知道更改API很糟糕,但让我们假设我在内部处理一些事情,并且在实现过程中意识到属性实际上应该是只读的。)

EN

回答 2

Stack Overflow用户

发布于 2012-02-08 10:55:36

通过使用两者,Moose的最大优点是它的简洁性。比较经典的perl OO:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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面向对象系统。

票数 11
EN

Stack Overflow用户

发布于 2012-02-08 12:28:31

Python面向对象的优势可能在于它的普遍性。也就是说,内置的OO系统非常简单,语法也非常容易接近,因此它无疑是占主导地位的Python编程范例。例如,Todd Gardner的第一个"Person“示例的粗略等价物可能如下所示:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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设计中有明显的优势--以至于没有理由让任何替代的对象模型获得巨大的吸引力。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9186776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档