More Related Content Similar to PerlのOOPにおいて、コンストラクタ 内でメンバ関数を呼ぶ方法は?(Perl Beginners #15) (20) PerlのOOPにおいて、コンストラクタ 内でメンバ関数を呼ぶ方法は?(Perl Beginners #15)1. † Perl Beginners #15 †
申し訳程度にPerl OOP
での質問をします
ほかは謎便利ツール?紹介
2014/10/7
大野義貴(CL)
2. 私
大野義貴(CL) twitter @CLCLCL
五反田の派遣・アポイントマッチング会社のサーバエ
ンジニア
2000年くらいから地方の印刷屋でPerlやっていた
iモードコンテンツ屋さんがHTTPで206 Partial
Contentで戦っていたころ印刷屋さんではPDFのペー
ジ毎分割配信で206と戦っていた
CPAN Author流行ってた頃ノリでCPAN Author
最近転職して東京出てきた
11. from Adafruit_I2C import Adafruit_I2C
from time import sleep
class Adafruit_CharLCDPlate(Adafruit_I2C):
# ---------------------------------------------
# Constructor
def __init__(self, busnum=-1,
addr=0x20, debug=False):
self.i2c = Adafruit_I2C(addr, busnum, debug)
[snip]
self.displayshift = (self.LCD_CURSORMOVE | self.LCD_MOVERIGHT)
self.displaymode = (self.LCD_ENTRYLEFT | self.LCD_ENTRYSHIFTDECREMENT)
self.displaycontrol = (self.LCD_DISPLAYON|self.LCD_CURSOROFF|self.LCD_BLINKOFF)
self.write(0x33) # Init
self.write(0x32) # Init
self.write(0x28) # 2 line 5x8 matrix
self.write(self.LCD_CLEARDISPLAY)
self.write(self.LCD_CURSORSHIFT|self.displayshift)
self.write(self.LCD_ENTRYMODESET
| self.displaymode)
self.write(self.LCD_DISPLAYCONTROL
| self.displaycontrol)
self.write(self.LCD_RETURNHOME)
# ---------------------------------------------
# Write operations
def write(self, value, char_mode=False):
""" Send command/data to LCD """
[snip]
液晶モジュール
表示用プログラ
ム:オリジナル
はPython
オブジェクトの
コンストラクタ
(初期化)部分
で、メンバ関数
を呼んでいる
12. package Adafruit_CharLCDPlate;
use HiPi::Device::I2C; use HiPi::BCM2835::I2C;
# ------------------------------------------------------
# Constructor
sub new {
my $class = shift; my %args = ( @_ ); my $self = {};
$self->{addr}= 0x20;
$self->{i2c} = HiPi::Device::I2C
->new(address => $self->{addr});
$self->{i2c}->smbus_write_byte_data(MCP23017_IOCON_BANK0, 0b10100000);
$self->{displayshift} = (LCD_CURSORMOVE|LCD_MOVERIGHT);
$self->{displaymode} = (LCD_ENTRYLEFT |LCD_ENTRYSHIFTDECREMENT);
$self->{displaycontrol} = (LCD_DISPLAYON |LCD_CURSOROFF|LCD_BLINKOFF);
return bless $self, $class;
}
# Constructor_2
sub init {
my $self = shift;
$self->write(0x33); # Init
$self->write(0x32); # Init
$self->write(0x28); # 2 line 5x8 matrix
$self->write(LCD_CLEARDISPLAY);
$self->write(LCD_CURSORSHIFT |$self->{displayshift});
$self->write(LCD_ENTRYMODESET|$self->{displaymode});
$self->write(LCD_DISPLAYCONTROL|$self->{displaycontrol});
$self->write(LCD_RETURNHOME);
}
# ------------------------------------------------------
# Write operations
sub write {
my $self = shift;
[snip]
}
液晶モジュール表示
ライブラリを、
Pythonから
Perlにオレオレ移植
オブジェクトのコン
ストラクタ(初期化)
部分でメンバ関数を
呼べないので、オブ
ジェクト生成後、
$obj->init()
を別口で呼ぶことで
メンバ関数を利用
14. PerlのOOPにおいて、コンストラクタ
内でメンバ関数を呼ぶ方法はないか?
質問
my $obj = HOGE->new();
$obj->write('done.');
exit;
package HOGE;
sub new { # Constructor
my $class = shift;
my $self = {};
$self->write('init...'); # ERROR!!
return bless $self, $class;
}
sub write { # Member function
my $self = shift;
my $str = shift;
print "$strn";
}
16. blessを変数に入れておいて、後で変数を
returnする
解決
my $obj = HOGE->new();
$obj->write('done.');
exit;
package HOGE;
sub new { # Constructor
my $class = shift;
my $self = {};
my $obj = bless $self, $class;
$self->write('init...'); #PASS!
return $obj;
}
sub write { # Member function
my $self = shift;
my $str = shift;
print "$strn";
}