2022.05.24 - [개발/Python] - [Python] 클래스 2 / 예제로 공부하는 Python 100 문제풀이
이전 글에 이어서 진행한다.
1. 특별한 메서드
특별한 메서드는 __init__, __del__ 처럼
__ (언더바) 2개를 앞 뒤로 써주면 된다.
class Person2:
def __init__(self, name, age):
self.name = name
self.age = age
def print_info(self):
print(self.name, ", ", self.age)
p2 = Person2('kim', 27)
p2.print_info()
p3 = Person2('hong', 19)
p3.print_info()
'''
kim , 27
hong , 19
'''
#위에 반드시 __init__을 붙여줘야한다. __init__은 특별한 생성자
기존에는 create_info(self, name, age)를 이용해서
p2.create_info('kim', 27) 이런 식으로 사용했다면
__init__ 을 이용하면 클래스 선언과 동시에 같이 넣어준 파라미터를 이용해 초기화가 가능하다.
비슷한 사용으로 소멸자가 있다.
소멸자는 생성한 객체를 지워주는 것으로 소멸자를 이용해서 소멸한 이후 같은 변수명을 선언하면 에러가 발생한다.
#소멸자
#생성자는 __init__ 소멸자는 __del__
class SmartPhone:
#생성자
def __init__(self, name, price):
self.name = name
self.price = price
print(self.name+" 객체 생성")
print("-"*40)
print(self.name+"스마트폰의 가격은 "+str(self.price)+"원 입니다")
print("-"*40)
#소멸자
def __del__(self):
print(self.name+" 객체 소멸")
s1 = SmartPhone("Apple", 1000000)
del s1
'''
Apple 객체 생성
----------------------------------------
Apple스마트폰의 가격은 1000000원 입니다
----------------------------------------
Apple 객체 소멸
'''
클래스 내에서 __del__ 을 이용해 생성해주고
사용은 del [객체명] 을 이용해 소멸시켜준다.
2. 외부 호출 메서드
#클래스 메서드 안에서 다른 메서드 호출
class Test:
def a_method(self):
print("a_method create")
def b_method(self):
self.a_method() #self사용해서 a_method호출
t1 = Test()
t1.a_method()
t1.b_method()
'''
a_method create
a_method create
'''
위는 클래스 안에 있는 각각 다른 메서드를 통해서 호출하는 방법이다.
t1.a_method()는 자신을 호출했고
t1.b_method()는 내부에서 self.a_method()를 통해 a_method를 호출했다.
#만약 위의 b_method에서 self.a_method의 self를 지우면 외부의 a_method 가르킴
class Test2:
def a_method2(self):
print("a_method create")
def b_method2(self):
a_method2() #self사용해서 a_method호출
def a_method2():
print("클래스 외부에 정의된 a_method")
t2 = Test2()
t2.a_method2()
t2.b_method2()
'''
a_method create
클래스 외부에 정의된 a_method
'''
이는 위와 다르게
클래스 내부에 선언된 것이 아닌 클래스 외부에 def a_method2라는 동일한 이름의 메서드를 생성한 것이다.
t2.b_method()로 a_method2()를 호출하자
밖에 있는 a_method2를 호출했는데
이는 앞서 self가 빠졌기 때문이다.
3. 변수 변경
#클래스 변수
class Test3:
a_var = 0
def a_method3(self):
Test3.a_var = 6000
def b_method3(self):
self.a_var = 300
print("1. 초기값 : ", Test3.a_var)
#1. 초기값 : 0
Test3.a_var = 3000
print("2. 변경", Test3.a_var)
#2. 변경 3000
t3 = Test3()
t3.a_method3()
print("3 클래스 내 메서드 호출로 변경", Test3.a_var)
#3 클래스 내 메서드 호출로 변경 6000
#print(Test3.a_method3())
#직접 호출은 에러 발생
뭐.. 이렇다...
그림이 더 어려운 것 같다...
근데 변수를 사용할 때
self 혹은 클래스명을 조심해서 사용해야 한다.
잘못 사용하는 경우 값이 변하지 않는 경우가 발생할 수 있다.
#값이 변경 안되는 경우
class Test4:
var_4 = 0
def method_4(self):
self.var_4 = 300
print("초기값 : ", Test4.var_4)
t4 = Test4()
t4.method_4()
print("4. 300으로 변경", Test4.var_4) #변경안된 앞의 값인 0 출력됨
#method_4 의 self.var_4 를 사용했기 때문에 값 변경이 안됨
#t4 에는 300이 저장됨
print("check : ", t4.var_4)
# check : 300
#혹은 위의 self.var_4를 Test4.var_4로 변경
4. 인스턴스 유무 확인
#특정 클래스의 인스턴스 유무 확인 -> isinstance( [인스턴스 객체명], [클래스명] )
class Test5:
pass
class Test6:
pass
t5 = Test5()
result = isinstance(t5, Test5)
print("Test5 클래스의 인스턴스 객체가 맞는가?", result)
#True
result2 = isinstance(t5, Test6)
print("Test6 클래스의 인스턴스 객체가 맞는가?", result2)
#False
사용법은 간단하다.
isinstance( [인스턴스 객체명], [클래스명] )
을 넣어주면
True, False를 반환한다.
5. 객체의 개수
#객체의 개수
class Test7:
count = 0
def __init__(self, name, age):
self.name = name
self.age = age
self.increase_obj()
def increase_obj(self):
Test7.count += 1
t7 = Test7('kim', 20)
print('count - ', Test7.count)
#count - 1
어렵지 않다.
객체를 선언할 때마다 지정된 count값을 추가하면 된다.
'Language > Python' 카테고리의 다른 글
[Python] print() 정리 및 예제 (0) | 2022.08.05 |
---|---|
[Python] TypeError: 'list' object is not callable 에러 (1) | 2022.07.19 |
[Python] 클래스 2 / 예제로 공부하는 Python 100 문제풀이 (0) | 2022.05.24 |
[Python] 클래스 / 예제로 공부하는 Python 100 문제풀이 (0) | 2022.05.17 |
[Python] 랜덤 모듈 / 예제로 공부하는 Python 100 문제풀이 (0) | 2022.05.17 |
댓글