๊ด€๋ฆฌ ๋ฉ”๋‰ด

Doby's Lab

return self, ๋‚˜๋ฅผ ์™œ ๋ฆฌํ„ด ํ•ด์•ผ ํ• ๊นŒ? (Method Cascading) ๋ณธ๋ฌธ

Code about AI/Python

return self, ๋‚˜๋ฅผ ์™œ ๋ฆฌํ„ด ํ•ด์•ผ ํ• ๊นŒ? (Method Cascading)

๋„๋น„(Doby) 2024. 4. 27. 19:55

๐Ÿค” 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