인스턴스 변수에 엑세스할 수 있도록 첫 번째 인자에 항상 객체 자신을 의미하는 self파라미터를 갖는다.
해당 메서드를 호출한 객체에만 영향을 미친다.
객체 속성에 접근이 가능하다.
class Test:
def __init__(self, name, age):
self.name = name
self.age = age
def print_info(self):
print(self.name, ',', self.age) #1
def test_func(self):
self.print_info()
test1 = Test('song', 30)
test1.print_info() #2 결과값 : song , 30
test1.test_func() #3 결과값 : song , 30
위 코드에서 print_info(), test_func() 가 인스턴스 메서드
에 해당한다.
#1 => 메서드 안에서 메서드를 호출 할 때는 self.메서드() 형식으로 호출한다.
#2, #3 => 클래스 밖에서는 객체.메서드명 형식으로 호출
객체와 독립적이지만, 로직상 클래스 내에 포함되는 메서드이다.
@staticmethod
라는 데코레이터를 붙여서 해당 메서드가 정적 메서드임을 표시한다.class Calc:
count = 10 # 클래스 변수(클래스 속성)
@staticmethod
def add(a):
print(a + Calc.count) # 클래스 속성에는 엑세스가 가능하다.
@staticmethod
def mul(a):
print(a * Calc.count)
Calc.add(15) # 결과값 :25
Calc.mul(15) # 결과값 : 150
인스턴스 없이 호출이 가능하다는 점에서 정적 메서드와 비슷하지만 약간의 차이점이 있다.
@classmethod
라는 데코레이터를 붙여 해당 메서드가 클래스 메서드임을 표시한다.class Person:
count = 0 # 클래스 속성
def __init__(self):
Person.count += 1
@classmethod
def print_count(cls):
print('{0}명 생성되었습니다.'.format(cls.count)) # 클래스 속성에는 엑세스가 가능하다.
@classmethod
def create(cls):
p = cls() # 메서드 내부에서 cls()로 현재 클래스의 인스턴스를 만들 수도 있다. 즉, cls() = Person()을 의미한다.
return p
ryan = Person()
apeach = Person()
Person.print_count() # 결과값 : 2명 생성되었습니다.
print(Person.create()) # 결과값 : <__main__.Person object at 0x000001BA0AE143D0> Person클래스로 부터 생성된 인스턴스임을 확인할 수 있다.
class Figure:
@classmethod
def set_name(cls, name):
cls.name = name
# Figure 클래스를 상속받음
class Circle(Figure):
pass
Figure.set_name("figure")
print(Figure.name, Circle.name) # 결과값 : figure figure
Circle.set_name("circle")
print(Figure.name, Circle.name) # 결과값 : figure circle
class Figure:
@staticmethod
def set_name(name):
Figure.name = name
# Figure 클래스를 상속받음
class Circle(Figure):
pass
Figure.set_name("figure")
print(Figure.name, Circle.name) # 결과값 : figure figure
Circle.set_name("circle")
print(Figure.name, Circle.name) # 결과값 : circle circle
Reference
kwonky티스토리
journeytosth티스토리