时常听到有人说,XXX语言是面向过程的,而XXX语言是面向对象的……我认为这种说法不是很妥当,面向过程和面向对象只是一种编程的思路而已,和具体的编程语言无关。Perl应该算是一种面向过程的语言(它可以写得很像C的风格,虽然我不大喜欢),但如果你大量调用了BioPerl的模块,它就是一种不折不扣的面向对象的思路。
因为我们是在调用别人编写的(标准的)BioPerl模块,所以里面使用到的各种对象的结构都是别人已经定义好的,我们无须了解内部的细节。但是了解一下这个对象的类型却是很有必要的,因为它关系到你能够调用这个对象的哪些属性和方法。比如,一写出 \$seq_obj,可以想到它能调用 ->seq这样的方法;而一写出 $seqio_obj,可以想到它能调用 ->next_seq 这样的方法。如何查看一个对象的类型呢?很简单,用ref函数。
下面可以来复习下之前提过的各种对象。
(1)构建一条fasta序列:
$seq_obj = Bio::Seq->new( -display_name => "gi|147605|gb|J01673.1|ECORHO", -desc => "E.coli rho gene coding for transcription termination factor", -seq => "AACCCTAGCACTGCGCCGAAATATGGCATCCGTGGTATCCCGACTCTGCTGCTGTTCAAAAACGGTGAAG" );
我们只需写这么一条语句:
print ref($seq_obj),"\n";
就可以查出 $seq_obj 这个对象究竟是什么“类型”的对象,结果是 Bio::Seq 类型的对象
(2)从文件中获取fasta序列:
$catchseq = Bio::SeqIO->new(-file=>'ecorho.fasta', -format=>'fasta'); $seq_obj = $catchseq->next_seq;
查一下类型,发现 $catch_seq 是 Bio::SeqIO::fasta 类型, 而调用它的next_seq方法得到的 $seq_obj 则是 Bio::Seq 类型,正好与(1)中提到的 \$seq_obj 一样,所以(1)中提到的 $seq_obj 能调用什么方法,它这里就能调用什么方法!
(3)从文件中获取genbank序列:
$catchseq = Bio::SeqIO->new(-file=>'ecorho.gbk', -format=>'genbank'); $seq_obj = $catchseq->next_seq;
查一下类型,发现 $catch_seq 是 Bio::SeqIO::genbank 类型,其实应该不用说大家也猜出来了。
但是,查一下 $seq_obj,我们猜也应该是 Bio::Seq 类型。错了!其实是 Bio::Seq::RichSeq 类型。为什么呢?很简单,因为GenBank格式拥有比fasta格式更丰富的信息,所以叫做 RichSeq 呗!它不仅拥有 Bio::Seq 对象所拥有的全部方法(比如,->display_id, ->seq, ->desc),还有其它的方法,用来获取其它额外的序列信息。(其实我们更加关系这些信息才对,只不过具体操作步骤要以后再说了,因为真的很复杂哎!)
(4)从远程数据库中下载序列:
$db_obj = Bio::DB::GenBank -> new; $seq_obj = $db_obj -> get_Seq_by_acc('J01673'); $filename = $seq_obj -> accession; $output_seq = Bio::SeqIO -> new(-file => ">$filename.gbk", -format =>'genbank'); $output_seq -> write_seq($seq_obj);
查一下类型,发现 \$db_obj 是 Bio::DB::GenBank 类型,而 $seq_obj 是 Bio::Seq::RichSeq 类型。这是理所当然的,因为 \$seq_obj 里面放的是GenBnak序列。
现在我们就可以认为,表面上看起来都是写成 $seq_obj,其实里面的含义大有不同哦!
尊重他人劳动成果,转载请注明出处:Bluesky's blog » 初品BioPerl(第六篇:对象的类型)
现在基本都是面向对象了。
是的,最新的perl6也是完全的面相对象了