본문 바로가기

misut

메서드와 함수의 차이

파이썬에서는 각각의 object마다 특별한 속성 유무를 체크하는데 callable도 그 속성중 하나이다

callabel 속성이 있는 object는 뒤에 괄호를 여는 식으로 사용이 가능하다

예를들어

함수 print는 함수 object인데 callable이다.

사용자가 만든 클래스도 기본적으로callable이기 때문에

class A:

    ...

A()

print()

이런 방법으로 사용이 가능하다.

 

함수와 메서드의 공통점

 

기본적으로 둘 다 callable이고 내부적으로 local scope를 선언해서 코드를 가지고 있을 수 있다

def print()

    #code

처럼 들여쓰기해서 쓴 #code 를 내부적으로 가지고 있을 수 있다.

이러한 callable object를 호출하면 내부 코드부분을 실행한다.

 

함수와 메서드의 차이점

클래스 내부의 attribute이냐 글로벌 attribute이냐의 차이이다.

함수는 글로벌 attribute이기 때문에 코드 어디서든 호출이 가능하다.

 

list 클래스의 pop 메서드는 파이썬 내부 코드상 built-in 클래스의 built-in method이다.

built-in은 기본적으로 존재하는 오브젝트라고 생각하면 편하다

 

근데 built-in method들은 공통적으로 read-only 이다.

호출은 가능하지만 변경은 불가능하다.

 

list.sort()는 되지만 list.sort = 1은 불가능

 

함수는 상관없어서 print =1 은 에러 없이 가능하다.

 

하지만 직접 만든 클래스의 메서드는 read-only가 아니기 때문에 

class A():

    def pop(self):

        ...

a= A()

a.pop = 1

은 에러가 나지 않는다.

 

그리고

class A: 하고 선언하면 

이때 A를 클래스라고 하고 A가 글로벌 스코프에 있기 때문에 코드 어디서든지 호출이 가능하다

def print():

    A()

도 가능하다

 

모든 클래스는 태생적으로 callable 인데 클래스를 호출하면 해당 클래스의 인스턴스를 반환한다.

 

클래스 변수와 클래스 멤버 변수

class A:
    apple = "apple"
    def __init__(self):
        self.banana = "banana"
위에서 apple은 클래스 변수이고 banana는 클래스 멤버 변수이다.

 

 여기서 중요한 점은 A를 인스턴스화 하지 않았을때

A.apple은 호출이 가능하지만 A.banana는 호출이 불가능하다는 점이다

a = A() 하고 인스턴스를 만들었을 때는 a.apple a.banana 모두 호출이 가능하다

 

심화문제1.

class A:
    apple = "apple"
    def __init__(self):
        self.banana = "banana"
a = A()
a.apple = "APPLE"
print(A.apple)

a라는 인스턴스를 생성했지만 클래스 A의 apple변수를 호출했으므로

결과값은 apple이다

 

 

인스턴스 a는 클래스 A의 멤버변수 또한 자신의 멤버변수로 가진다

 

심화문제2.

class A:
    apple = "apple"
    def __init__(self):
        self.banana = "banana"
A.apple = "APPLE"
a = A()
print(a.apple)

의 결과값은 APPLE

 

심화문제3.

class A:
    apple = "apple"
    def __init__(self):
        self.banana = "banana"
a = A()
A.apple = "APPLE"
print(a.apple)

의 결과값은 apple

 

이부분에서 붕어빵이랑 연관지어서 이해했는데 민무늬 붕어빵틀에서 붕어빵을 굽고 붕어빵틀에 무늬를 넣으면

붕어빵에는 무늬가 없고(심화문제3)

붕어빵틀에 먼저 무늬를 넣고 붕어빵을 구우면 무늬 있는 붕어빵이 나오는 것을 생각했다.(심화문제2)

 

심화문제4.

class A:
    apple = "apple"
    def __init__(self):
        self.banana = "banana"

def new_init(self):
    self.banana = "BANANA"

A.__init__ = new_init
a = A()
a.banana

 

의 결과값은 BANANA 인데

 

A.__init__도 A의 attribute인데

__init__은 A의 메서드라서 __init__의 첫번째 파라미터는 self여야한다.

A의 attribute는 A가 built-in 클래스가 아니라서 read-only가 아니기 때문에 변형이 가능하다.

 

A.__init__도 변경하려는 값이 callable이고 해당 callable의 첫번째 파라미터가 self이기만 하면 변경해도 문제없다는 뜻이고

여기서 변경하려는 값이 new_init인데 함수이기때문에 callable이고 첫번째 파라미터가 self이니까 변경 가능하다