본문 바로가기
Language/Python

[Python] 클래스 3 / 예제로 공부하는 Python 100 문제풀이

by 애기 개발자 2022. 5. 30.
반응형

2022.05.24 - [개발/Python] - [Python] 클래스 2 / 예제로 공부하는 Python 100 문제풀이

 

[Python] 클래스 2 / 예제로 공부하는 Python 100 문제풀이

2022.05.17 - [개발/Python] - [Python] 클래스 / 예제로 공부하는 Python 100 문제풀이 [Python] 클래스 / 예제로 공부하는 Python 100 문제풀이 클래스는 파이썬을 OOP로서의 기능을 사용하게 해주는 도구이다...

baby-dev.tistory.com

 

이전 글에 이어서 진행한다.

 

 

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값을 추가하면 된다.

 

 

28 클래스 3.py

 

 

반응형

댓글