注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Bioinformatics home

 
 
 

日志

 
 

perl 5面对对象模块Moose (强烈推荐)  

2012-06-08 23:45:24|  分类: Perl |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
perl 5面对对象模块Moose, 对复杂的perl 面对对象进行改装。用其官方的话说
Moose 是为perl量身定做的后模式面对对象,屏蔽了枯燥的面对对象的写法。尽管Mosse来源于Perl5,但其借鉴来自Perl 6 , LISP, smallTalk, Jave,  BETA, OCaml, Ruby and more的许多优秀的特征. (Moose is a postmodern object system for Perl 5 that takes the tedium out of writing object-oriented Perl. It borrows all the best features from Perl 6, CLOS (Lisp), Smalltalk, Java, BETA, OCaml, Ruby and more, while still keeping true to its Perl 5 roots.)。
小试了用Mosse 构建类,比较简单,我们一起来看看吧
首先我们新建两个空文件( person.pm 和 test.pl), 放在同一文件夹下
编写person.pm (这个类定义文件)
package Person;  #类名
use Moose; #告诉perl你要使用 Moose
#自定义一个属性 ssn 
  has 'ssn' => (
      is        => 'rw', #可读写
      isa       => 'Str', #字符串型
      predicate => 'has_ssn', #判断是否存在该属性
 reader => 'get_ssn', #读该属性值,ssn也就变成private的。在类内部都不能掉用ssn这个方法
      writer => 'set_ssn', #设定该属性值
 required => 1 #该属性值必须有
  );

  has 'country_of_residence' => (
      is      => 'rw', 
      isa     => 'Str',
      default => 'usa'
  );
  has 'first_name' => (
      is  => 'rw',
      isa => 'Str',
 writer =>'set_first_name',
 reader=>'get_first_name'
  );
  has 'last_name' => ( #读写方法函数均为 last_name
      is  => 'rw',
      isa => 'Str', 
  );

  #BUILDARGS 在类创建之前
  around BUILDARGS => sub {
      my $orig = shift;
      my $class = shift;
      if ( @_ == 1 && ! ref $_[0] ) {
          return $class->$orig(ssn => $_[0]);
      }
      else {
          return $class->$orig(@_);
      }
        };
#自定义有返回值一个类方法
sub add
{
my $self=shift;
my $a=shift;
my $b=shift;
return $self->get_first_name(). ($a+$b);
}
#自定义没有返回值类方法
sub printname
{
 my $self=shift;
 print $self->get_first_name()." ".$self->last_name."\n";
}

#在类创建之后
#构造函数,也可以省略
sub BUILD {
  my $self = shift;
  print 'new last name '.$self->last_name."\n";
  if ( $self->country_of_residence eq 'usa' ) {
 die 'Cannot create a Person who lives in the USA without an ssn.'
 unless $self->has_ssn;
  }
  $self->last_name('kkkkkkk');
  print "thank you very much\n";
}
no Moose; #结束使用Moose,不能省略!

__PACKAGE__->meta->make_immutable; #让该类执行更快,不过第一次花费的时候稍微长一些,以后调用就省时间了

看看test.pl 是如何使用该类的
use Person; 
my $pp = Person->new(ssn=>'77-99-88',first_name=>"li",last_name=>'hehe' ); #构建类,要用hash模式初始化属性
print $pp->get_first_name.'  '. $pp->last_name.   "\n";   #调用get_first_name属性读取函数
print $pp->country_of_residence."\n";
 $pp->country_of_residence("china"); #设置属性函数
print $pp->country_of_residence."\n";


my $person = Person->new('123-45-6789'); #这里没用hash模式定义肿么办?类定义  around BUILDARGS在捣鬼,为什么是这样,看官方文档去
print 'xiei'.$person->get_ssn()."\n"; 
$person->set_ssn('99-00-88');

$person->set_first_name(999);

print 'xiei'.$person->get_first_name()."\n";

print $person->add(15,9)."\n";
$person->last_name('wang');
print "last".$person->last_name."\n";


说到类,肯定要讲讲子类继承,函数重写的问题

我们继续新建一个文件叫user.pm ( User 类继承 Person 类,, 仍然放在同一个文件夹下)
package User;
use Moose;
extends 'Person'; #类继承
has 'username' => ( is => 'rw' ); #增加一个属性
has 'id' => ( is => 'rw' );

#重写函数
 override 'add' => sub {
      my $self = shift;
      #super();
my $a=shift;
my $b=shift;
      return '10000'.($a+$b);
  };
  
#重写函数
  override 'printname' => sub {
      my $self = shift;
      #
my $something=shift;
super(); #调用父类函数
print $something."\n";
  }; 

no Moose;
__PACKAGE__->meta->make_immutable;

接着再看看怎么调用子类,新建test2.pl文件
test2.pl内容为:

use User; #不用再写 use  Person了
#调用父类
my $pp = User->new(ssn=>'77-99-88',first_name=>"li",last_name=>'hehe' );
print $pp->get_first_name.'  '. $pp->last_name.   "\n";
print $pp->country_of_residence."\n";
$pp->country_of_residence("china");
print $pp->country_of_residence("china")."\n";

$pp->username('username');
print $pp->username()."\n";

print $pp->add(4,5)."\n";

#函数重载
$pp->printname('xiexie');

$pp->id('8888');
print $pp->id."\n";



  评论这张
 
阅读(2956)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017