【问题标题】:Perl 5 OOP programmingPerl 5 OOP 编程
【发布时间】:2021-05-28 00:28:25
【问题描述】:

我正在尝试将以下 python 程序移植到 perl5:

import numpy as np


class Hensuu:
    def __init__(self, data):
        self.data = data


class Kansuu:
    def __call__(self, input):
        x = input.data
        y = x ** 2
        output = Hensuu(y)
        return output

x = Hensuu(np.array(9.0))
f = Kansuu()
y = f(x)

print(type(y))
print(y.data)

ma​​in.Hensuu'> 81.0

Hensuu.pm

package Hensuu;
use strict;
use warnings FATAL => 'all';
our $version = 1.0.0;
sub new {
    our ($class,$data) = @_;
    my $self = {data=>$data};
    bless $self,$class;
    return $self;
}
1;

step1.pl

#!perl
use strict;
use warnings FATAL => 'all';
use Hensuu;
use PDL;
use PDL::Matrix;
my $datas = mpdl [[1.0,2.0],[3.0,4.0]];
my $x = Hensuu->new($datas);
print($x=>$datas);

甘肃.pm

package Kansuu;
#use strict;
use warnings FATAL => 'all';
use Hensuu;
sub call {
    my ($self,$input) = @_;
    my $x = {$input => $data};
    #print($x);
    my $y = $x ** 2;
    my $output = Hensuu->new($y);
    return($output);
}
1;

step2.pl

#!perl
#use strict;
use warnings FATAL => 'all';
use PDL;
use PDL::Matrix;
use Hensuu;
use Kansuu;

my $a = mpdl [9.0];
my $x = Hensuu->new($a);
#my $f = Kansuu;
#my $y = $f->call($x);
my $y = Kansuu->call($x);
print($x=>$a);
print(ref($y));
print($y);

发射(step2.pl)

Hensuu=HASH(0x1faf80)
[
 [9]
]
HensuuHensuu=HASH(0x25b71c0)
Process finished with exit code 0

上述程序(step2.pl), 我想用 print($y) 将显示设置为“81”,但我不能。 环境为Windows 10 pro,草莓perl PDL版(5.32.1.1), IDE是intellij idea社区版perl插件(2020.3)。

【问题讨论】:

  • 如果你想在 perl 中使用现代 OOP,请查看 Moose 或 Moo

标签: python perl


【解决方案1】:

Hensuu.pm:

package Hensuu;
use strict;
use warnings;

sub new {
    my ($class, $data) = @_;
    return bless {data => $data}, $class
}

sub data {
    my ($self) = @_;
    return $self->{data}
}

1

甘肃.pm:

package Kansuu;
use strict;
use warnings;

use Hensuu;

sub call {
    my ($input) = @_;
    my $x = $input->data;
    my $y = $x ** 2;
    my $output = Hensuu->new($y);
    return $output->data
}

1

step2.pl:

#!perl
use strict;
use warnings;
use feature qw{ say };

use PDL;
use PDL::Matrix;
use Hensuu;
use Kansuu;

my $p = mpdl [9.0];
my $x = Hensuu->new($p);
my $y = Kansuu::call($x);
say $y;
  • 不要将our 变量用于不需要全局的变量。
  • 不要将$a用作词法变量,它是sort中使用的特殊变量。
  • 低级 Perl OO 不会为属性创建访问器,您需要自己实现它们(请参阅 MooMoose 了解更高级别的方法)。
  • Kansuu 不是 OO 类,请使用完全限定的子例程而不是方法。

【讨论】:

  • Re“Kansuu不是OO类,用全限定子程序代替方法”,静态类没有问题。 sub call { my ($self,$input) = @_; ... }Kansuu->call($x) 很好。 (但您的选择也是如此。)
  • @ikegami:是的,但是如果没有实例和类属性,我倾向于根本不包括 OO(有点像奥卡姆剃刀)。另外,我会使用$class 而不是$self 作为类方法。
  • Re "Occam's razor",Kansuu::call 并不比 Kansuu->call 简单(这不是 Occam 剃刀的意思)。
  • Re "我会使用 $class 而不是 $self 作为类方法。",同上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 2013-12-16
  • 2010-09-27
相关资源
最近更新 更多