èªäœã¯ã©ã¹ãæžããŠããŠããªãã ãçµã¿èŸŒã¿åã¿ããã«çŽæçã«æ±ãããããã®ã«ãªâŠããšæããããšã¯ãããŸãããïŒ+ã§ãªããžã§ã¯ãå士ãè¶³ãããã==ã§äžèº«ãæ¯èŒããããprint()ã§äººéãèªãã圢ã«è¡šç€ºãããããããããã¹ãŠèªåã®ã¯ã©ã¹ã§ã«ã¹ã¿ãã€ãºã§ããã®ããPythonã®ç¹æ®ã¡ãœããïŒãã³ããŒã¡ãœããïŒã§ãã
ç¹æ®ã¡ãœãããçè§£ãããšãNumPyã®ndarrayãpandasã®DataFrameã®ãããªããã®äŸ¿å©ãããã¯ã©ã¹ããã©ãäœãããŠããã®ããèŠããŠããŠãã³ãŒããæžãã®ãäœåãæ¥œãããªããŸãâš ãã®èšäºã§ã¯å®éã®åç»è§£èª¬ãããŒã¹ã«ãæŒãããŠãããã代衚çãªç¹æ®ã¡ãœãããæŽçãã€ã€ãåŠç¿ããã£ãšå éãããŠãããæžç±ãã¬ãžã§ããã玹ä»ããŠãããŸãã
ç¹æ®ã¡ãœãããšã¯ãPythonã®èšèªä»æ§ãšããŠãåŒã³åºãããã¿ã€ãã³ã°ã決ãŸã£ãŠãããç¹å®ã®ååã®ã¡ãœããã®ããšã§ããã¡ãœããåã®ååŸãã¢ã³ããŒã¹ã³ã¢2ã€ïŒ__ïŒã§å²ãŸããŠããã®ãç¹åŸŽã§ãéç§°ããã³ããŒïŒdunderïŒã¡ãœããããšåŒã°ããŸãã
ãã£ãšã身è¿ãªäŸã¯__init__ãselfãšåŒæ°ãåãåã£ãŠãã€ã³ã¹ã¿ã³ã¹çææã«èªåçã«åŒã³åºãããâã€ãã·ã£ã©ã€ã¶âã§ãããããããšåãããªã§ããè¶³ãç®ããããšãããæ¯èŒããããšãããprint()ã«æž¡ããããšãããªã©ã®ã¿ã€ãã³ã°ããšã«å°çšã®ç¹æ®ã¡ãœãããçšæãããŠããã®ã§ãã
__add__ ãš __radd____add__ïŒå·ŠåŽã®ãªããžã§ã¯ãã®åäœãå®çŸ©ããšãã°SapuNumberãšããèªäœã¯ã©ã¹ãäœã£ãŠãSapuNumber(10) + SapuNumber(20)ãšæžãããšãã«ãæ°å€ãæååãšããŠé£çµããŠ"1020"ãè¿ããã¿ãããªç¬èªæåãä»èŸŒããã®ã__add__ã§ãã
class SapuNumber:
def __init__(self, value):
self.value = value
def __add__(self, other):
if isinstance(other, SapuNumber):
return f"{self.value}{other.value}"
return NotImplemented ãã€ã³ãã¯ãæ³å®å€ã®åãšè¶³ãããå Žåã«NotImplementedãè¿ãããšããããè¿ããšPythonã¯ããããå³åŽã®ãªããžã§ã¯ãã«èããŠã¿ããããšå€æããŠãããŸãã
__radd__ïŒå³åŽã®ãªããžã§ã¯ããšããŠåŒã°ãããšã__add__ãNotImplementedãè¿ãããšããPythonã¯å³èŸºã®ãªããžã§ã¯ãã«__radd__ããªãããæ¢ãã«è¡ããŸãããããå®çŸ©ããŠããã°ãå¥ã¯ã©ã¹åå£«ã®æŒç®ã§ãæè»ã«æåãæ±ºããããããã§ããã
åãä»çµã¿ã§__sub__ïŒãã€ãã¹ïŒã__mul__ïŒæãç®ïŒã__truediv__ïŒå²ãç®ïŒãªã©ãã»ãŒãã¹ãŠã®ç®è¡æŒç®åã«å¯Ÿå¿ããç¹æ®ã¡ãœãããçšæãããŠããŸãã
__new__ ãš __init__ ã®éããæŒãããã__new__ãš__init__ã£ãŠäœãéãã®ïŒããšããã®ã¯ååŠè
ãã¶ã€ããå®çªã®çåã§ãããã£ããæŽçãããšãããªããŸãã
__new__ïŒã€ã³ã¹ã¿ã³ã¹ãã®ãã®ãçæããæ®µéã§åŒã°ããã第äžåŒæ°ã¯clsïŒã¯ã©ã¹èªäœïŒã__init__ïŒ__new__ã§äœãããã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠåæååŠçãè¡ã段éã§åŒã°ããã第äžåŒæ°ã¯selfãå€ãã®å Žåã¯__init__ã ãã§äºè¶³ããŸãããintãstrã®ãããªã€ãã¥ãŒã¿ãã«ãªåãç¶æ¿ããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹çæãã«ã¹ã¿ãã€ãºãããå Žåã¯__new__ã䜿ãå¿
èŠããããŸãããªããªãã€ãã¥ãŒã¿ãã«åã¯çæåŸã«å€ã倿Žã§ããªããããçæããâãã®ç¬éâã§ããå€ãå·®ãæ¿ããããªãããã§ããã
class SapuInt(int):
def __new__(cls, n):
new_value = n + 1
return super().__new__(cls, new_value)
print(SapuInt(10)) # â 11 __eq__ïŒç䟡æ¯èŒãã«ã¹ã¿ãã€ãº==ã§æ¯èŒãããšãã®æåãå®çŸ©ããã®ã__eq__ãããšãã°ããŠãŒã¶ãŒã¯ã©ã¹ã¯IDãäžèŽããŠããã°åäžãšã¿ãªããã¿ãããªæ¯èŒã«ãŒã«ãå®è£
ã§ããŸãã
class SapuUser:
def __init__(self, id, name):
self.id = id
self.name = name
def __eq__(self, other):
if isinstance(other, SapuUser):
return self.id == other.id
return NotImplemented ããã§ãNotImplementedãè¿ããŠããã°ãå³èŸºã®ã¯ã©ã¹ãæã€__eq__ã«åŠçãå§ããããŸãã__lt__ïŒ<ïŒã__gt__ïŒ>ïŒãªã©ãæ¯èŒæŒç®åããšã«å¯Ÿå¿ããã¡ãœãããçšæãããŠããã®ã§ããœãŒããéåæŒç®ããã£ãšèªç¶ã«æžããããã«ãªããŸãã
__setitem__ ãš __getitem__ïŒè§æ¬åŒ§ã¢ã¯ã»ã¹ãå®è£
obj[0] = "Apple"ã®ããã«ãèªäœã¯ã©ã¹ã§ããªã¹ããèŸæžã¿ããã«è§æ¬åŒ§ã§å€ãåºãå
¥ããããââãããªãšãã«äœ¿ãã®ããã®ãã¢ã§ããpandasã®DataFrameãNumPyã®ndarrayã®è£åŽã§ãã¬ãããªäœ¿ãããŠããä»çµã¿ã§ããã
class SapTwoSizeArray:
def __setitem__(self, index, value):
if index == 0:
self.v0 = value
elif index == 1:
self.v1 = value * 2
else:
raise IndexError("index out of range")
def __getitem__(self, index):
if index == 0:
return self.v0
elif index == 1:
return self.v1
raise IndexError("index out of range") __getitem__ãå®è£
ãããšforã«ãŒãã§åããããã«ãªããªãã±ããã£ãŠãããŒã¿æ§é ã£ãœãã¯ã©ã¹ãäœããšãã®åŒ·åãªæŠåšã«ãªããŸãã
__str__ïŒäººéã«ããããæåå衚çŸprint(obj)ãstr(obj)ã«æž¡ããããšãã«è¿ãæååãå®çŸ©ããŸããäœãå®è£
ããŠããªããš<__main__.SapuUser object at 0x...>ã¿ãããªçŽ ã£æ°ãªã衚瀺ã«ãªããŸããã__str__ãæžããŠããããšãã£ãšèªã¿ããããªããŸãã
class SapuUser:
def __init__(self, id, name):
self.id = id
self.name = name
def __str__(self):
return self.name åãããªã§__int__ã__float__ãæžãã°ãint(obj)ãfloat(obj)ã§ã®åå€æçµæãèªç±ã«æ±ºããããŸãããããã°çšéã«ã¯__repr__ãã»ããã§èŠããŠãããšäŸ¿å©ã§ããã
ð¡ ç¹æ®ã¡ãœãããçè§£ã§ãããšãPythonã®æåã©ã€ãã©ãªãã©ãäœãããŠããã®ãããã ãã ãèŠããŠãããæèŠããããŸããèªããã³ãŒãã®å¹ ãåºããã®ã§ãåŠç¿å¹çãäžæ°ã«äŒžã³ãŸããã
ç¹æ®ã¡ãœããã®ãããªâã¡ãã£ãšæ·±ãâãããã¯ãè °ãæ®ããŠçè§£ããã«ã¯ãæå ã®ç°å¢ãåèæžãæŽããã®ããã¡ã°ãã®è¿éã§ããå®éã«ã³ãŒããåãããŠã¿ãæéãå¢ãããããã«ã以äžã®ã¢ã€ãã ãæããŠãããšåŠç¿å¹çããããšäžãããŸãðª
ã¯ã©ã¹ã»ããŒã¿ã¢ãã«ã»ç¹æ®ã¡ãœãããŸãããããªãããèšèšãããŠããã®ãããšããèæ¯èŸŒã¿ã§è§£èª¬ããŠãããå®çªæžãåç»ã§èŠããç¥èãäœç³»ãšããŠæŽçããããšãã«æåŒ·ã®çžæ£ã§ãã
ç¹æ®ã¡ãœããã䜿ãããªããããã«ãªããšãã©ããŸã§æžããšèªã¿ãããã®ããã®ã»ã³ã¹ãåãããŸããåœåãã€ã³ã¿ãŒãã§ãŒã¹èšèšã®åºç€ã磚ããªããå®çªäžã®å®çªããã²ã
ç¹æ®ã¡ãœãããå®è£ ããŠãã¹ãããŠâŠãšè©Šè¡é¯èª€ããŠãããšãã¿ã€ãã³ã°éã¯ãã£ãšããéã«èšå€§ã«ãæãžã®è² æ ãæžãããŠãããéé³èµ€è»žã®ã¡ã«ãã«ã«ããŒããŒãããããšãéäžæéããã£ãšäŒžã³ãŸãã
å·Šã«ãšãã£ã¿ãå³ã«Pythonå ¬åŒããã¥ã¡ã³ãïŒããŒã¿ã¢ãã«ã®ç« ã¯ç¹æ®ã¡ãœããã®å®åº«ïŒïŒã䞊ã¹ããšåŠç¿å¹çãåçã«äžãããŸããæã¡éã¹ãã¢ãã€ã«ã¢ãã¿ãŒã¯åšå® ãšã«ãã§åŠç¿ã®äž¡æ¹ã§æŽ»èºã
ãããšäžæ©ã§__new__ã®æåããããããâŠããšãããšãã«åšå²ã®éé³ã鮿ããŠãããçžæ£ãé·æéåŠç¿ã§ãç²ãã«ãã軜éã¢ãã«ãéžã¶ã®ãã³ãã§ãã
ãããããã䜿ãã®ã¯10ã20åçšåºŠã§ãããŸãã¯__init__ / __str__ / __repr__ / __eq__ / __add__ / __getitem__ããããæŒãããã°ãèªäœã¯ã©ã¹ããã£ãšâPythonãããâæ¯ãèã£ãŠãããŸãã
__init__ãš__new__ã¯ã©ã¡ãã䜿ãã°ããã§ããïŒåºæ¬ã¯__init__ã§OKã§ãã__new__ã䜿ãã®ã¯ãintãstrã®ãããªã€ãã¥ãŒã¿ãã«åãç¶æ¿ããŠãã€ã³ã¹ã¿ã³ã¹çæã®ã¿ã€ãã³ã°ã§å€ãå€ãããããªã©ãããªãéå®ãããå Žé¢ã«çµãããŸãã
NotImplementedãšNotImplementedErrorã¯åããã®ã§ããïŒããããå¥ç©ã§ããNotImplementedã¯ç¹æ®ã¡ãœããããèªåã§ã¯åŠçã§ããªãã®ã§å¥ã®ã¡ãœããã«ä»»ããŸãããšäŒããããã®å®æ°ãäžæ¹NotImplementedErrorã¯ãæªå®è£
ãã瀺ãäŸå€ã¯ã©ã¹ã§ããç®è¡æ¯èŒã®ç¹æ®ã¡ãœããã§ã¯åè
ãè¿ãã®ãæ£è§£ã§ãã
Pythonå ¬åŒããã¥ã¡ã³ãã®ãããŒã¿ã¢ãã«ïŒData modelïŒãã®ã»ã¯ã·ã§ã³ããã€ãã«ã§ããæ¬èšäºã§ç޹ä»ãããã®ãå«ãããã¹ãŠã®ç¹æ®ã¡ãœãããæŽçãããŠããã®ã§ãæžç±ãšããããŠèªãã®ãããããã§ãã
ãããŸããããŒã¿ã¯ã©ã¹çãªãªããžã§ã¯ãã®æ¯èŒã«ãŒã«å®çŸ©ïŒ__eq__/__hash__ïŒããã°ããããã°çšã®è¡šç€ºïŒ__str__/__repr__ïŒãç¬èªã³ã¬ã¯ã·ã§ã³ã®å®è£
ïŒ__getitem__/__len__/__iter__ïŒãããã¯ãçŸå Žã§ãé »ç¹ã«ç»å ŽããŸãã
ç¹æ®ã¡ãœããã¯ãèªäœã¯ã©ã¹ãPythonçµã¿èŸŒã¿åãšåããããèªç¶ã«æ±ããããã«ããŠããã匷åãªä»çµã¿ã§ãã__add__/__radd__ã§æŒç®åãã__eq__ã§æ¯èŒãã__getitem__/__setitem__ã§è§æ¬åŒ§ã¢ã¯ã»ã¹ãã__str__ã§è¡šç€ºãââããããã«ã¹ã¿ãã€ãºããããšã§ãã³ãŒãã¯ãã£ãšèªã¿ãããã䜿ããããé²åããŠãããŸãã
åç»ã§å šäœåãã€ããã ãããã²æå ã§å°ããªã¯ã©ã¹ãäœã£ãŠå®éšããŠã¿ãŠãã ããð£ ãããŠãæžç±ãããŒããŒããã¢ãã¿ãŒãšãã£ãâç°å¢ãžã®æè³âã¯ãåŠç¿ã¹ããŒããå éããããã¡ã°ã確å®ãªè¿éã§ãã仿¥ç޹ä»ããã¢ã€ãã ããããªãã®Pythonã©ã€ããäžæ®µéã¬ãã«ã¢ãããããçžæ£ã«ãªããŸãããã«ïŒ
ð ãåãã³ãŒãããããèœã¡ãª…
ð Pythonã®ãå¶åŸ¡æ§æã…
ð ãæååãèªåšã«æãã人ã…
ð ãèªã¿ãããã³ãŒããã¯å€æ°…
ð ããã°ã©ãã³ã°ã®ãã¹ãŠã¯ã…
ð ãæååã«å€æ°ãå ¥ãããã…