中学に通っていたのがもう20年も前って考えると俺も歳取ったなぁ……

おまとめ三行

いろいろ情報が足りなかったりするかもしれません
メソッドチェーンにはピリオドを使います
クラスの基本は押さえられたと思うんですが
前回は関数の使い方を見ていきましたが、今回はクラスを使ってみたいと思います。実を言うとPythonのクラスはまだよく分かってないところがあるもんで、だからいろいろ情報が足りなかったりするかもしれません。その辺はご容赦くだせえ。



基本のクラス

とりあえず適当の文字を出力するようなクラスを作ってみたいと思います。

まずはPHPから。

class SampleClass {
  function output() {
    echo 'あかつきのお宿';
  }
}

$s = new SampleClass();
$s->output();

こんな感じですね。これと同じことをPythonでやるとこうなります。

class SampleClass() :
  def output(self) :
    print('あかつきのお宿')
        
s = SampleClass()
s.output()

ほぼ一緒ですが微妙にPHPと書き方が違うところがありますね。

まずクラス名にかっこがついてます。別につけなくてもエラーにはならないんですが、他のクラスを継承する時などにはかっこが必要になります。それについては後でやりましょう。

それからoutput()の引数に「self」ってのが入ってますね。これはPHPのクラスで言うところの「$this」に相当するものです。上記のような書き方の場合、selfを明示的に書いておかないとエラーになるようです。ちなみに必ずしも「self」でなければならないわけではないようです。この位置にある変数を$this的に扱うというだけなので、「myself」とか「myangel」とか「miwakunomyangel」とかでも問題なく動きます。一般的にはselfと書く場合が多いようです。

あとインスタンスを生成するときに「new」を書く必要がないです。というか、これはインスタンスを生成しているという動きではないのかな? 単に変数にクラスを渡してるだけ的な。

そしてメソッドチェーンにはピリオドを使います。PHPの矢印に相当するやつです。

おおまかな違いとしてはこんなとこですかね。



selfがなくても大丈夫な場合

先ほどselfは明示的に書かないとエラーになると言いましたが、エラーにならない書き方もあります。

class SampleClass() :
  def output() :
    print('あかつきのお宿')
        
SampleClass.output()

一度変数にクラスを渡すのではなく、直接呼び出す場合はselfがなくても動きます。むしろこの書き方だとselfがあると引数が足りねーぞって言われて逆にエラーになっちゃいます。

これはあれなんですかね。静的メソッドっていう扱いになるんでしょうか? PHPで言うこの書き方に相当するやつ。

SampleClass::output()

PHPの場合もこっちの書き方だと「$this」が使えなくなるんで、感覚的には同じような気がするんですが……どうでしょ?



引数に値を渡してみる

ほんじゃあ今度は引数に適当な値を渡してみませう。

class SampleClass() :
  def output(self, text) :
    print(text)
        
s = SampleClass()
s.output('あかつきのお宿')

明示的にselfを書かなきゃいけない場合は、引数が一つずつ後ろにずれます。上の場合だと「text」に「あかつきのお宿」を渡してることになります。

キーワード引数やアスタリスクなどももちろん使えます。

#キーワード引数
class SampleClass() :
  def output(self, a = 1, b = 2, c = 3) :
    print(c) #5

s = SampleClass()
s.output(c = 5)

#アスタリスク
class SampleClass() :
  def output(self, *args, **kwargs) :
    print(args) #(1, 2, 3) 
    print(kwargs) #{'a': 1, 'b': 2, 'c': 3}

s = SampleClass()
s.output(1, 2, 3, a = 1, b = 2, c = 3)

キーワード引数やアスタリスクについては前回やったので、良かったらあわせてご覧くだせえ。

関数を作ろう



メンバ変数

Pythonだとメンバ変数って言わないかもしれないですが、クラスの中で定義している変数を使う場合。

class SampleClass() :
  text = 'あかつきのお宿'

  def output(self) :
    print(self.text)

s = SampleClass()
s.output()

これはPHPと同じ要領ですね。「$this->text」的な。ただ、これだとselfの定義が必須になるので、先ほどのself不要パターンの書き方だと対応できなくなってしまいます。

一応こういう書き方は可能っぽいです。

class SampleClass() :
  text = 'あかつきのお宿'

  def output() :
    print(SampleClass.text)

SampleClass.output()

これもいわゆるstaticな扱いってことになるのかしら……すみません、ちょっと分かんないっす。



クラス内で別の関数を呼び出す

これも要領的にはPHPと同じです。

#selfあり
class SampleClass() :
  def output(self) :
    print(self.get_text())
      
  def get_text(self) :
    return 'あかつきのお宿'

s = SampleClass()
s.output()


#selfなし
class SampleClass() :
  def output() :
    print(SampleClass.get_text())
      
  def get_text() :
    return 'あかつきのお宿'

SampleClass.output()



コンストラクタ

PHPの場合、コンストラクタは「__construct()」と書きますが、Pythonは「__init__()」と書きます。

//PHP
class SampleClass {
  function __construct() {

  }
}


#Python
class SampleClass() :
  function __init__(self) :
    pass

ちなみにデストラクタは「__del__()」です。



継承

PHPだとクラスの継承はextendsを使いますが、Pythonはかっこの中にクラスオブジェクトを入れることで継承できます。

//PHP
class ParentClass {
  public $text = 'あかつきのお宿';
}

class SampleClass extends ParentClass {
  public $text = 'あかつきのお宿';
  function output() {
    echo $this->text;
  }
}

$s = new SampleClass();
$s->output();


#Python
class ParentClass :
  text = 'あかつきのお宿'

class SampleClass(ParentClass) :
  def output(self) :
    print(self.text)
      
s = SampleClass()
s.output()

こんな感じですね。継承したクラスの変数や関数はselfで使えます。






これでクラスの基本は押さえられたと思うんですが……他にこれは見といた方が良いってのあるかしら。

PHPとは微妙に違うようなところもあるようなないような感じですが、でもPHPでクラスの使い方に慣れていればそんなに戸惑うこともないのかなという気もします。



その他のPythonを少し触ってみたの記事はこちら
前書きと索引的な