self
- 파이썬의 method는 항상 첫번째 인자. 파라미터로 self를 전달
- self는 현재 해당 메쏘드가 호출되는 객체 자신을 가리킴
- C++/C#, Java의 this에 해당
- 역시, 이름이 self일 필요는 없으나, 위치는 항상 맨 처음의 parameter이며 관례적으로 self로 사용
- 메소드가 불리는, 대상이되는 객체 그 자신을 가리킴
- self는 즉, 호출된 객체 자체를 가리킴.
class Person: #person클래스
def __init__(self, name, age): #파라미터 self, name, age
print('self: ', self)
self.name = name #self.속성(attribute) -> name, age 속성
self.age = age
def sleep(self): #person 클래스의 method. 그래서 self 파라미터를 받고
print('self:', self)
print(self.name, '은 잠을 잡니다.')
a = Person('Aaron', 20) #a,b 객체 생성. a,b 변수에 담음
b = Person('Bob', 30)
print('print a:', a)
print('print b:', b)
#각 객체가 메모리상에 상주하고 있는 주소.
# a,b가 각각 다른 개체니까, 다른 메모리상에. 주소달라
a.sleep()
# a객체에 sleep함수를 호출.
# a속성인 00는 잠을 잡니다 호출됨
b.sleep()
# self의 기능은, 현재 함수(메소드)가 호출되는
# 그 객체 자기 자신을 가리킨다.
# (이름이 self일 필욘 없는데 파이썬 관례)
mehtod 정의
- 클래스가 처리하고자하는 행동(함수의 형태로 클래스 안에 구현)
- 가장 첫번째 파라미터로 self. ->즉 호출된 대상객체. 자신의 주소가 넘어옴
- 멤버함수라고도 하며, 해당 클래스의 object(객체)에서만 호출가능
- method는 객체 레벨에서 호출되며, 해당 객체의 속성에 대한 연산을 행함
- {obj}.{method}() 형태로 호출됨 -> a.sleep()
# 1. 숫자를 하나 증가
# 2. 숫자를 0으로 초기화
class Counter: #클래스
def __init__(self):
self.num = 0 # num method를 갖는다. -> 항상 처음 생성되면 0으로 초기화된다
# counter클래스로부터 생성한 객체에
# increment 메소드를 호출할 수 있어
def increment(self): # increment method 추가
self.num += 1 # +1되는 메소드
def reset(self):
self.num = 0
# increment, reset method에서 self는
# 메소드가 불리는 그 대상이 되는 객체가 전달되기 때문에
# 자기자신 객체에게만 데이터값을 갱신한다
def print_current_value(self):
print('현재값은:', self.num)
# c1 객체 생성
c1 = Counter()
# c1의 print~~ 메소드 호출
c1.print_current_value()
현재값은: 0
c1.increment() #최초는 0이었다가
c1.print_current_value()
# 반복 실행할 때 마다 +1씩
현재값은: 3
c1.reset() #다시초기화
c1.print_current_value()
현재값은: 0
c2 = Counter() #c2라는 객체 새로생성
c2.increment()
c2.print_current_value()
현재값은: 3
method type
- instance method - 객체로 호출
- 메쏘드는 객체 레벨로 호출 되기 때문에, 해당 메쏘드를 호출한 객체에만 영향을 미침
- class method(static method) - class로 호출
- 클래스 메쏘드의 경우, 클래스 레벨로 호출되기 때문에, 클래스 멤버 변수만 변경 가능
# 보통은 인스턴스 메소드.(위 까지 다룬것)
# but, 인스턴스 메소드가 필요없는 경우도 있다
# 객체 레벨 : m, c1, c2
# 클래스 레벨 : Counter() Person()이게 클래스레벨
# 덧셈, 곱셈을 지원하는 math 클래스
class Math:
@staticmethod #요렇게 데코레이터 해주면
def add(a, b):
return a + b
@staticmethod
def multiply(a, b):
return a * b
# math 클래스는 속성. self가 없다. self가 할일이 없어
# self.속성 속성정의 안해줬어
# 인스턴스 메소드는 원래 이렇게 객체생성-> 메소드 불러왔는데
m=Math()
m.add(10,20)
m.multiply(10,20)
200
# static 메소드(클래스 메소드)
# 속성(데이터)을 유지할 필요없고, 전달된 데이터를 처리만하는 경우에는
# 이제 static 메소드니까 클래스이름으로 함수 부를수 있어
# m=Math() 이렇게 객체 생성할 필요없이
# 클래스 이름으로 함수호출가능! 함수호출이 클래스 레벨에서
Math.add(10, 20)
Math.multiply(10, 20)
200