class クラス名: def メソッド名(self,引数,,):
class Member: def setName(self,n): self.name = n def showName(self): print(self.name)
クラスはインスタンスを生成しないと使えない。
# Memberクラスのオブジェクト生成 m = Member() m.setName("田中") m.showName()
上の例のmはMemberインスタンスを入れるための変数。Member()でMemberクラスのインスタンスを生成している。
class Member: def __init__(self): self.name = "鈴木" def showName(self): print(self.name)
m = Member() m.showName() # 鈴木と表示
class Member: def __init__(self,name): self.name = name def showName(self): print(self.name) m = Member("田中") m.showName() # 田中と表示
__init__のように特殊なメソッドをクラス内に作ることが出来る。
__str__ というメソッドを作るとstr関数を行ったときに自動的に呼ばれる。
class Member: def __init__(self): self.name = "鈴木" def __str__(self): return self.name + "さん" m = Member() print(str(m)) # 鈴木さんと表示
このような型変換を行うメソッドでは他に __int__ や __float__ などがある。
__len__ というメソッドを作るとlen関数を行ったときに自動的に呼ばれる。
class Member: def __init__(self): self.name = "鈴木" def __len__(self): return len(self.name) m = Member() print(len(m)) # 2と表示
__getitem__ というメソッドを作るとインスタンス[添え字]を行ったときに自動的に呼ばれる。
class Member: def __init__(self): self.name = "鈴木" def __getitem__(self, n): return self.name[n] m = Member() print(m[0]) # 鈴と表示
代入用に__setitem__ もある
class Member: def __init__(self): self.name = "鈴木" def __setitem__(self, n, value): self.name = self.name[:n] + value + self.name[n+1:] m = Member() m[0] = '山' print(m.name) # 山木と表示
Pythonでは基本的にメンバはpublicであり、外部から全てアクセスできる。しかし、擬似的にprivateを実現することも出来る。それは属性名の先頭に__(アンダーバー2個)を付けること
class Member: def __init__(self,name): self.__name = name m = Member('鈴木') print(m.__name) # エラー
※ただし、m._Member__name ではアクセスできてしまうのであくまで擬似的。
このとき @poperty デコレーションを付けたメソッドを作ると属性のようにアクセス可能(読み取り専用)。
class Member: def __init__(self,name): self.__name = name @property def name(self): return self.__name m = Member('鈴木') print(m.name)
@属性名.setter デコレーションで属性の設定も可能。
class Member: def __init__(self,name): self.__name = name @property def name(self): return self.__name @name.setter def name(self, value): self.__name = value m = Member('鈴木') m.name = "山田" print(m.name)
スーパークラス(親クラス)の属性・メソッドを全て引き継いでサブクラスを作る
class サブクラス名(スーパークラス名):
class Animal: def __init__(self,name): self.name = name def showName(self): print(self.name) class Dog(Animal): def naku(self): print("ワン")
d = Dog("ポチ") d.naku() # ワンと表示 d.showName() # ポチと表示
super().メソッド名 でスーパークラス(親クラス)のメソッドを呼び出せる。
class サブクラス名(スーパークラス名):
class Animal: def __init__(self,name): self.name = name def showName(self): print(self.name) class Dog(Animal): def __init__(self,name,type): super().__init__(name); self.type = type def naku(self): print("ワン") def showName(self): print(self.type) super().showName(); d = Dog("ポチ","芝犬") d.showName() # 柴犬 ポチと表示
3.7以降。データを入れるためのクラスを明示的に定義。コンストラクタは自動生成される。基本的な使い方はクラスと同じ
from dataclasses import dataclass @dataclass class User: name: str age: int = 0 def show(self): print(f'{self.name}さん。{self.age}歳') u = User('田中',30) u.show() print(u.name) # 田中 print(u.age) # 30
# コンストラクタの直後に何かする場合 __post_init__ 関数を定義 class User: name: str age: int = 0 namelen: int = 0 def __post_init__(self): self.namelen = len(self.name)
# 変更不能にする @dataclass(frozen=True) class User: name: str age: int = 0
# 辞書に変換 d = dataclasses.asdict(u) print(d)