前記事
の続きです。
__str__
インスタンスの文字列表現を取得。
toString的なやつ
Person.py
class Person:
last_name = ''
given_name = ''
def __init__(self, last_name = '(性)', given_name = '(名)'):
self.last_name = last_name
self.given_name = given_name
"""分かりやすいようにフルネームを表示してあげる。"""
def __str__(self)->str:
return f'{self.last_name} {self.given_name}'
$ from Person import Person
$ person = Person() # インスタンス生成
$ print(person) # 文字列表現を取得
(性) (名)
$ myPerson = Person('山田', '太郎') # プロパティ指定してインスタンス生成
$ print(myPerson)
山田 太郎
__repr__
↑の続き
Person.py
class Person:
last_name = ''
given_name = ''
def __init__(self, last_name = '(性)', given_name = '(名)'):
self.last_name = last_name
self.given_name = given_name
"""分かりやすいようにフルネームを表示してあげる。"""
def __str__(self)->str:
return f'{self.last_name} {self.given_name}'
"""デバッグ用にクラスプロパティ(性、名)表示"""
def __repr__(self)->str:
return f'{self.last_name=}, {self.given_name=}'
$ person = Person('河田', '陽菜')
$ print(person) # まだ__repr__は反映されていない
河田 陽菜
Person.py (strはreprより優先されるためコメントアウト)
class Person:
last_name = ''
given_name = ''
def __init__(self, last_name = '(性)', given_name = '(名)'):
self.last_name = last_name
self.given_name = given_name
"""分かりやすいようにフルネームを表示してあげる。"""
# def __str__(self)->str:
# return f'{self.last_name} {self.given_name}'
"""デバッグ用にクラスプロパティ(性、名)表示"""
def __repr__(self)->str:
return f'{self.last_name=}, {self.given_name=}'
$ person = Person('河田', '陽菜')
$ print(person)
self.last_name='河田', self.given_name='陽菜'
__bool__
インスタンス自体の真偽値を返却
例
CSV読み取りで
ファイルが存在し かつ 1行以上読み込めたら正当なファイルとする
CSVReader.py
import csv
from pathlib import Path
class CSVReader:
path = ""
exists = False
count = 0
limit = 3
def __init__(self, path):
self.path = path
"""有効なファイルであるか(ファイルが存在し行が存在するか)の判定結果を返却"""
def __bool__(self) -> bool:
return (self.exists and self.count) >= 1
def read(self):
# 最初にファイルの存在チェック
if Path(self.path).exists:
self.__setExists__(True)
else:
pass
with open(self.path) as f:
rows = csv.reader(f, delimiter=",", quotechar='"')
count = 0
print(f'対象ファイルの先頭{self.limit}行を読み取ります。')
for row in rows:
print(", ".join(row))
count = count + 1
self.__setCount__(count)
if (count >= self.limit):
break
def __setExists__(self, exists=False) -> None:
self.exists = exists
def __setCount__(self, count=0) -> None:
self.count = count
$ cat input.csv # 4行用意
"1","2","3"
"January","February","March"
"mutsuki","kisaragi","yayoi"
"one","two","three"
$ from CSVReader import CSVReader as reader
$ csv = reader('input.csv')
$ csv.read()
対象ファイルの先頭3行を読み取ります。
1, 2, 3
January, February, March
mutsuki, kisaragi, yayoi
$ csv.__bool__()
True # ファイルが存在し、行が読み取れたため
$ cat input.csv # ファイル削除し、試行
cat: input.csv: No such file or directory
$ 略
$ csv.__bool__()
False # ファイルが存在しないため
もちらんifや3項演算子の評価対象として使用可能
$ file = 'valid' if csv else 'invalid' # インスタンス自体を真偽値として扱った際に__bool__の結果が反映される。
$ print(file)
valid