Upgrade to Pro — share decks privately, control downloads, hide ads and more …

__init__とかって何だよって話

yujikawa
October 26, 2017

 __init__とかって何だよって話

特殊メソッドについてのお話

yujikawa

October 26, 2017
Tweet

More Decks by yujikawa

Other Decks in Technology

Transcript

  1. 自己紹介 class Person(object): """ Person Class """ def __init__(self): self.name

    = "川上祐司" self.job = "エンジニア" self.twitter = "@yujikawa_py" yujikawa.py
  2. 例で理解する特殊メソッド-未使用- 下記は単語を比較するプログラムです class Word(object): def __init__(self, text): self.text = text

    def equals(self, word): return self.text.lower() == word.text.lower() if __name__ == "__main__": word1 = Word("apple") word2 = Word("apple") diff = word1.equals(word2) print(diff) # True word.py ←テキストを比較する部分をもっと直感的にしたい!
  3. 例で理解する特殊メソッド-使用- 特殊メソッドを使ういつもと同じような比較ができる class Word(object): def __init__(self, text): self.text = text

    def __eq__(self, word): return self.text.lower() == word.text.lower() if __name__ == "__main__": word1 = Word("apple") word2 = Word("apple") print(word1 == word2) # True word.py
  4. 特殊メソッドの紹介① 種類 メソッド 意味 比較系 __eq__(self, other) self == other

    __ne__(self, other) self != other __lt__(self, other) self < other __gt__(self, other) self > other __le__(self, other) self <= other __ge__(self, other) self >= other 計算系 __add__(self, other) self + other __sub__(self, other) self – other __mul__(self, other) self * other __floordiv__(self, other) self // other __truediv__(self, other) self / other __mod__(self, other) self % other __pow__(self, other) self ** other
  5. 特殊メソッドの紹介② 種類 メソッド 意味 コレクション操作 __len__(self) len(self) __getitem__(self, key) val[key]

    __setitem__(self, key, value) val[key] = value その他 __str__(self, other) str(self) __repr__(self, other) repr(self) __len__(self, other) len(self) ※これらの特殊メソッドはほんの一部です
  6. 自作カウンターを作ろう② class Counter(object): def __init__(self, value): # 初期値がList型の場合 if isinstance(value,

    list): self.num = {} for key in value: self.num[key] = self.num.get(key,0) + 1 # 初期値がDict型の場合 elif isinstance(value, dict): self.num = value # 初期値がString型の場合 elif isinstance(value, str): self.num = {value:0} else: raise TypeError("{} is not Dict or List or String".format(value)) counter.py 初期化の処理でList、Dict、Stringのそれ ぞれを処理しよう!
  7. 自作カウンターを作ろう③ class Counter(object): # ……省略…… 下記を追加# def __add__(self, counter): #

    要素ごとの足し算 new_num = self.num.copy() for key, val in counter.num.items(): new_num[key] = self.num.get(key,0) + val return Counter(new_num) def __sub__(self, counter): # 要素ごとの引き算 new_num = self.num.copy() for key, val in counter.num.items(): new_num[key] = self.num.get(key,0) - val return Counter(new_num) counter.py 特殊メソッドを利用して、足し算引き 算をオリジナル実装しよう!
  8. 自作カウンターを作ろう④ >> from counter import Counter >> counter1 = Counter({'apple':1,

    'banana':2}) >> counter2 = Counter(['apple', 'banana', 'melon', 'melon']) >> counter3 = Counter('strawberry') >> >> counter1 <__main__.Counter at 0x25578f0c470> >> counter2 <__main__.Counter at 0x25578f0c2e8> >> counter3 <__main__.Counter at 0x25578e5c048> >> counter_sum = counter1 + counter2 + counter3 >> counter_sum.num {'apple': 2, 'banana': 3, 'melon': 2, 'strawberry': 0} Python console ←これ分かりづらい。追加修正だ! ★理想:Counter({'apple':1, 'banana':2})
  9. 自作カウンターを作ろう⑤ class Counter(object): # ……省略…… 下記を追加# def __repr__(self): return "Counter({})".format(self.num)

    def __str__(self): return str(self.num) counter.py 特殊メソッドを利用して、インスタン スの表示をオリジナル実装しよう!
  10. 自作カウンターを作ろう⑥ >> from counter import Counter >> counter1 = Counter({'apple':1,

    'banana':2}) >> counter2 = Counter(['apple', 'banana', 'melon', 'melon']) >> counter3 = Counter('strawberry') >> >> counter1 Counter({'apple': 1, 'banana': 2}) >> counter2 Counter({'apple': 1, 'banana': 1, 'melon': 2}) >> counter3 Counter({'strawberry': 0}) >> print(counter1) {'apple': 1, 'banana': 2} Python console インスタンス表示はOK!完成!と思っ たけど各要素の値を取得したいし書き 換えたい欲望が・・
  11. 自作カウンターを作ろう⑦ class Counter(object): # ……省略…… 下記を追加# def __getitem__(self, key): return

    self.num[key] def __setitem__(self, key, value): if isinstance(key, str) and isinstance(value, int): self.num[key] = value else: raise TypeError("{} is not key=String value=Integer".format(value)) counter.py 特殊メソッドを利用して、インスタン スの表示をオリジナル実装しよう!
  12. 自作カウンターを作ろう⑧ >> from counter import Counter >> counter1 = Counter({'apple':1,

    'banana':2}) >> counter2 = Counter(['apple', 'banana', 'melon', 'melon']) >> counter3 = Counter('strawberry') >> >> print(counter1['apple']) 1 >> counter1['apple'] = 3 >> print(counter1['apple']) 3 Python console インスタンスだけどDict型のように操作 できるようになった!素敵!