return self, ๋๋ฅผ ์ ๋ฆฌํด ํด์ผ ํ ๊น? (Method Cascading)
๐ค Problem
ํ์ดํ ์น ๋ด์ ํด๋์ค ๋ด์ ๊ถ๊ธํ ๋ฉ์๋๊ฐ ์์ด์ ์์ค ์ฝ๋๋ฅผ ๋ณด๋ค๊ฐ ๋ฌธ๋ ์ด๋ฐ ๋ฌธ๋ฒ์ ๋ณด๊ฒ ๋ฉ๋๋ค.
def func(self, var1, var2):
...
...
return self
์ ๊ฐ ์์๋ก ๋ง๋ค์ด๋ณธ ๋ฉ์๋์
๋๋ค. ์ ๊ธฐ์ self
๋ฅผ ๋ฆฌํดํ๊ณ ์๋๋ฐ '์ self
๋ฅผ ๋ฆฌํดํ๊ณ ์๋ ๊ฒ์ธ๊ฐ?'๊ฐ ๊ถ๊ธํ์ต๋๋ค.
๊ทธ๋์ ์ด๋ฒ ํฌ์คํ ์์๋ ์ด ๊ฒ์ ๋ํด์ ์ด์ผ๊ธฐํด ๋ด ๋๋ค.
self
๊ฐ ์๋ฏธํ๋ ๋ฐ๊ฐ ์ธ์คํด์ค ๋ณธ์ธ์ ์ฐธ์กฐํ๊ณ ์๋ค๋ ๊ฒ์ ์ด์ ๋ ๋๋ฌด๋ ๋ช
ํํ๊ณ , ๋น์ฐํ ๊ด์ต์
๋๋ค.
ํท๊ฐ๋ฆฌ์ค ์ ์๊ฒ ์ง๋ง, ๋ฌธ๋ฒ์ด ์๋๋ผ ๊ด์ต์
๋๋ค. self
๊ฐ ์๋ ๋ค๋ฅธ ๊ฑธ๋ก ํด๋ ์๋ํฉ๋๋ค. ๊ฑฐ์ ๋ฌธ๋ฒ์ฒ๋ผ ์จ์ ๊ทธ๋ ์ต๋๋ค. ์๋์ ์ฝ๋๋ ์ ์์ ์ผ๋ก ์๋ํ๊ฑฐ๋ ์ :)
(๋ฌผ๋ก , ํ์ค์์ ์ ๋ฌ๋ฉด ๋ง์ ์์ ๋จน์ ์๋ ์์ต๋๋ค...)
class Person():
def __init__(myself, age: int):
myself.age = age
def print_age(myself):
print(myself.age)
p1 = Person(24)
p1.print_age()
๐ Solution: Method Cascading๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด์
https://stackoverflow.com/questions/43380042/purpose-of-return-self-python
Purpose of return self python
I have a problem with return self class Fib: def __init__(self, max): self.max = max def __iter__(self): self.a = 0 self.b = 1 return self def __next_...
stackoverflow.com
์๋ฌดํผ, return self
๋ฅผ ํ๋ ๊ฒฝ์ฐ๋ ๋ค์ ์์๋ก ๋๋ฌด ๋ช
์พํ๊ฒ ์ค๋ช
ํ ์ ์์ต๋๋ค.
์ ๋ ํผ๋ฐ์ค์ฒ๋ผ ๊ฐ์ ์ฝ๋๋ก ์ค๋ช ์ ํด๋ณด๊ฒ ์ต๋๋ค.
class Counter():
def __init__(self, start: int = 1):
self.val = start
def increment(self):
self.val += 1
def decrement(self):
self.val -= 1
์ ํด๋์ค์์ ์ธ์คํด์ค๋ฅผ ์ ์ธํ์ฌ, ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ์คํ์์ผ ๋ด ์๋ค.
c = Counter()
c.increment().decrement()
๋ฐ๋ก ์ด๋ฐ ์๋ฌ๊ฐ ๋์ง ์๋์? AttributeError: 'NoneType' object has no attribute 'decrement'
์๋ฌ ๋ด์ฉ์ ๋ณด๋ฉด, ํ์ฌ ๊ฐ์ฒด(์ธ์คํด์ค)๋ decrement์ ๊ฐ์ attribute(์์ฑ)์ด ์๋ค๊ณ ๋งํ๊ณ ์์ต๋๋ค. ์ด๊ฒ ๋ฌด์จ ๋ง๋ ์ ๋๋ ์๋ฆฐ๊ฐ ์ถ์ต๋๋ค.
c
๋ผ๋ ๊ฐ์ฒด์์ increment๋ฅผ ํ๊ณ , decrement ํ ๊ฑด๋ฐ c
๊ฐ NoneType์ด๋ผ๋ ๊ฒ์ ํ์ฌ ์ด๋ ํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ง ์๋ค๋ ๋ป์
๋๋ค. ๊ทธ๋ฌ๋ฉด, increment๊น์ง๋ ์ ์ฑ๊ณตํ๋ค๋ ๋ป์ด๊ฒ ๋ค์. ๋ฐ๋๋ก increment๋ฅผ ํ c
์์ decrement๋ ์ ์คํจํ์๊น์?
๊ทผ๋ฐ ์ ์๋ง์. c
์์ increment๋ฅผ ์ํํ์ ๋, ์ฐ๋ฆฌ๋ ์ ์ฌ์ ํ ๊ทธ ๊ฒฐ๊ณผ๊ฐ c
๋ฅผ ๊ฐ๋ฆฌํจ๋ค๊ณ ์๊ฐํ๊ณ ์๋์? increment๋ decrement ๊ตฌํ๋ถ์์๋ ์๋ฌด๊ฒ๋ ๋ฆฌํดํ๊ณ ์์ง ์์๋ฐ ๋ง์
๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์, ๋ค์ ๋งํด ๊ฐ์ฒด์ ๋ํ ๋ฉ์๋๋ฅผ ์ฐ์์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์ ๋ฉ์๋๋ฅผ ์ํํ ๊ฒฐ๊ณผ(์ธ์คํด์ค)๋ฅผ ๋ฆฌํดํด์ค๋ค๋ฉด, ์ด๋ฅผ ํด๊ฒฐํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด์ ๊ฐ์ด ๋ฉ์๋๋ฅผ ์ฐ์์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ Method Cascading์ด๋ผ๊ณ ํฉ๋๋ค.
๊ทธ๋์ c
๋ผ๋ ๊ฐ์ฒด๊ฐ ์ฐ์์ ์ผ๋ก ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ด ํด๋์ค๋ฅผ ๋ค์ ์ ์ธํด์ฃผ์ด์ผ ํฉ๋๋ค.
class Counter():
def __init__(self, start: int = 1):
self.val = start
def increment(self):
self.val += 1
return self
def decrement(self):
self.val -= 1
return self
๐ Reference
https://stackoverflow.com/questions/43380042/purpose-of-return-self-python
Purpose of return self python
I have a problem with return self class Fib: def __init__(self, max): self.max = max def __iter__(self): self.a = 0 self.b = 1 return self def __next_...
stackoverflow.com