記事概要
Pythonを少しでも読めるようになってみようと思い、参考書に沿って学習した備忘録になります。
Javaと比較して自身が気になった点、便利と感じた点をまとめております。
その1はこちら
その2はこちら
※かなり基礎的な内容になります。
クラス
クラスの概念自体はそこまで大きく違わない認識です。
クラス定義方法については、例を下記に記載してみます。
例
class SampleClass {
//クラス処理
}
class SampleClass:
#クラス処理
インスタンス化
クラスをインスタンス化する。
扱いはJavaとほとんど変わらない。はず
SampleClass sClass = new SampleClass();
sClass = SampleClass()
アトリビュート
Javaで言うインスタンス変数のようなもの(?)。
インスタンスに対してアトリビュートを追加できる。
sClass.attr = "あとりびゅーと"
print(sClass.attr)
>>あとりびゅーと
クラスのメソッド定義
クラスメソッドに引数を追加する場合には、第一引数にselfを追加する。
selfを使うとインスタンス自体を操作できる
例
class SampleClass {
int counter = 0;
int count(int a) {
counter += a;
}
}
class SampleClass:
counter = 0;
def count(self, a):
self.counter += a
初期化メソッド
初期化メソッドは__init__
(特殊メソッド)を使用する。
例
publiv class Human {
String name;
String birthday;
public Human(String name, String birthday) {
this.name = name;
this.birthday = birthday;
}
}
class Human:
def __init__(self, name = None, birthday = None):
self.__name = name
self.__birthday = birthday
カプセル化
カプセル化を行うにはメソッドやアトリビュートの前に__
(アンダースコア2つ)をつける。
__
を付けることで外部からのアクセスを禁止することが出来る。
メソッドやアトリビュートの前に_
(アンダースコア1つ)を付けた場合には慣習として、
「クラス内部でのみ使用するので、外部からアクセスしないでね」といった意味を持つ(らしい)。
※調べていたらアンダースコアは色々意味があるそうです。参考文献に調べた際の記事などリンク載せています。
追記
Pythonではgetter,setterを定義しないらしいです。
Pythonではget〇〇,set〇〇といったメソッドを定義することは非推奨のようです。
(属性へのアクセス方法はまた別にまとめるかもしれません)
今回の記事ではJavaと比較して、自分が理解しやすくするために、上記のような書き方でgetter,setterを定義しています。
ご了承ください。
アンダースコアの付け方、getter,setterを定義しない場合については、別途学習してまとめようかと考えています。
例
publiv class Human {
private String name;
private String birthday;
public Human(String name, String birthday) {
this.name = name;
this.birthday = birthday;
}
public getName() {
return this.name;
}
public getBirthday() {
return this.birthday;
}
public setName(String name) {
this.name = name;
}
public setBirthday(String birthday) {
this.birthday = birthday;
}
}
class Human:
def __init__(self, name = None, birthday = None):
self.__name = name
self.__birthday = birthday
def getName(self):
return self.__name
def getBirthday(self):
return self.__birthday
def setName(self, name):
self.__name = name
def setBirthday(self, birthday):
self.__birthday = birthday
継承
Pythonは多重継承が可能。
多重継承する場合には、,
で区切ってクラス名を指定する。
例
public class SuperMan extends Human {
private String ability;
public getAbility() {
return this.age;
}
public setAbility(String ability) {
this.ability = ability;
}
class SuperMan(Human): #多重継承の場合SuperMan(Human, Man)のような感じで定義する
def getAbility(self):
return self.__ability
def setAbility(self, ability = None):
self.__ability = ability
スロット
アトリビュートの追加を制限することが出来る特殊メソッド
__slots__ = [アトリビュート名1, アトリビュート名2, ...]
メモリの使用効率をよくする
class Profile:
__slots__ = ['height', 'weight', 'bloodType']
def __init__(self, bloodType = None):
self.bloodType = bloodType
a = Profile('A')
print(a.bloodType)
>>A
#slotsに定義されているアトリビュート
a.height = 170
a.weight = 60
a.constellation = 'Aries'
>>エラーが発生する
プロパティ
getter,setterを簡単に定義するための組み込み関数。
非公開のアトリビュートへのアクセス制御を簡単に行う。
property(getterメソッド名, [setterメソッド名])
class Human:
def __init__(self, name = None):
self.__name = name
def getName(self):
return self.__name
def setName(self, name):
self.__name = name
propName = property(getName, setName)
#代入を行うと、propertyで設定したsetterが動作する
propName = 'takeshi'
#取り出しを行うと、propertyで設定したsetterが動作する
print(propName)
>>takeshi
あとがき
Pythonのデメリットについて調べると、実行速度の遅さが出てきました。
今回まとめた__slots__
はそのデメリットを改善するために必要なことだと感じました。
Pythonらしい機能を適切に使えるよう理解を進めていきたいと思います。
参考文献
参考書
柴田淳(2016)「みんなのPython 第4版」SBクリエイティブ株式会社
公式リファレンス
Python公式リファレンス
データ型について
Pythonの組み込みデータ型の分類表(ミュータブル等)
アンダースコアについて
初学者のためのPython講座 オブジェクト指向編7 カプセル化
Lesson 12 クラスの定義 ― Python基礎文法入門
pythonのアンダーバーこれなんやねん