본문 바로가기
Python

Python - class

by DGK 2021. 10. 15.

 

인프런 파이썬 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

class

 

  • 기본 개념
# 기본 예시

# 클래스

class Dog(object):                      
    species = 'firstdog'               

    def __init__(self, name, age):      
        self.name = name               
        self.age = age                 

print(Dog)

# 위의 코드는 클래스의 기본 구조이며, 모든 클래스는 오브젝트를 상속받는다.

# species = 'firstdog' 코드는 클래스의 속성(클래스 변수)을 의미하고,
# def __init__(self, name, age): 코드는 클래스의 초기화/인스턴스 속성 이다.
# 또한, self.name = name 코드와 self.age = age 코드는 인스턴스 변수이다.
# 클래스 변수는 직접 접근 가능하고 공유되지만, 인스턴스 변수는 객체마다 별도로 존재한다.

# print(Dog)의 결과 값은 <class '__main__.Dog'>으로 클래스의 정보를 보여준다.



# 인스턴스화(설계도인 클래스를 바탕으로 객체를 구현한 것)

a = Dog("mickey", 2)
b = Dog("baby", 4)
c = Dog("kiki", 5)
d = Dog("mickey", 2)

print(a == b, id(a), id(b)) # 결과 : False 4560351584 4560351392
print(a == d, id(a), id(d)) # 결과 : False 4560351584 4560351200

# 여기서 a, b, c, d는 클래스를 바탕으로 인스턴스화된 변수(객체)이다.
# 인스턴스화된 객체들은 데이터가 동일하더라도, id값은 다르다.


print('dog1', a.__dict__)  # 결과 : dog1 {'name': 'mickey', 'age': 2}
print('dog2', b.__dict__)  # 결과 : dog2 {'name': 'baby', 'age': 4}

# 위의 코드처럼 네임스페이스를 활용하여, class의 속성을 확인할 수 있다.




# 활용 예시

print('{} is {} and {} is {}'.format(a.name, a.age, b.name, b.age))

# 결과 : mickey is 2 and baby is 4



if a.species == 'firstdog':
    print('{0} is a {1}'.format(a.name, a.species))
    
# 결과 : mickey is a firstdog



print(Dog.species)      # firstdog
print(a.species)        # firstdog
print(b.species)        # firstdog

# 이처럼 클래스 변수는 직접 접근이 가능하고 공유되며,
# 인스턴스 변수는 객체마다 별도로 존재한다.

 

 

  • 응용 개념
# self의 이해

class SelfTest():
    def func1():
        print('Func1 called')

    def func2(self):
        print('Func2 called')
        print(id(self))		# 4365466784

f = SelfTest()        
print(dir(f))       
print(id(f))			# 4365466784


f.func1()	  # 결과 : 에러발생
f.func2()	  # 결과 : Func2 called(함수호출 성공)

SelfTest.func1()  # 결과 : Func1 called(함수호출 성공)
SelfTest.func2()  # 결과 : 에러발생 


# 정리 :

# func1( ) 함수는 파라미터가 존재하지 않아서 클래스 함수이고, 
# func1( ) 함수의 호출 방법은 SelfTest.func1()의 코드처럼,
# 클래스로 직접 접근해서 함수를 호출해야 한다.



# func2( ) 함수는 파라미터 self가 존재하기 때문에 인스턴스 함수이고,
# func2( ) 함수의 호출 방법은 f.func2( )의 코드처럼 인스턴스화된 변수 f를 활용하거나,
# SelfTest.func2(f)의 코드처럼 인스턴스화된 변수 f를 전달인자로 넘겨줘야 한다.
# 그 이유는 파라미터 self가 존재하기 때문이다.

# 즉, 파라미터 self의 존재 유무에 따라서 함수를 호출하는 방법이 달라진다.


# 참고 :

# 인스턴스화된 변수 f의 id값과 self의 id값이 동일한 것은
# func2( ) 함수 호출 시, 인스턴스화된 변수 f가 파라미터 self에 들어가서,
# 함수 코드가 실행되기 때문이다.




# 활용 예시

# 예시1

# 클래스

class warehouse:
    stock_num = 0				  

    def __init__(self, name):	  
        self.name = name		
        warehouse.stock_num += 1

    def __del__(self):			
        warehouse.stock_num -= 1  


# 인스턴스화된 변수(객체 생성)

user1 = warehouse('Lee')
user2 = warehouse('cho')

print(warehouse.stock_num)

# 결과 : 2
# 객체가 2개(user1, user2) 생성되었기 때문에,
# 초기 stock_num 값(0)에 1이 두 번 더해져 2가 되었다.


print(user1.name)		# Lee
print(user2.name)		# cho
print(user1.__dict__)		# {'name': 'Lee'}
print(user2.__dict__)		# {'name': 'cho'}


print('before', warehouse.__dict__)
print(user1.stock_num)		# 2


warehouse.stock_num = 50
print(user1.stock_num)

# 결과 : 50
# 이처럼 클래스 변수에 접근해서, 해당 값을 변경할 수도 있다.


del user1
print('after', warehouse.__dict__)

# 결과 : stock_num가 1로 변경되었다.
# del을 통해 인스턴스화된 변수 user1을 삭제했기 때문이다.(객체 1개가 삭제됨)
# 이처럼 del을 사용하여 인스턴스화된 변수를 삭제할 수 있고,
# 그 결과 공유되고 있는 클래스 변수인 stock_num 값이 1로 변경된다.(소멸자 기능)


# 클래스 관련 정리내용 :

# stock_num = 0는 클래스 변수이며, 클래스와 인스턴스가 공유하는 속성이다.
# self.name = name는 인스턴스 변수(자신만의 속성)이다.

# def __init__(self, name): 코드는 객체가 메모리에서 초기화될 때,
# 자동으로 호출되는 함수를 의미한다.(생성자)
# def __del__(self):코드는 객체가 메모리에서 소멸할 때, 
# 자동으로 호출되는 함수를 의미한다.(소멸자)



# 예시2 

class Dog2:
    species = 'firstdog'		# 클래스 변수(공유 속성)

    def __init__(self, name, age):	# 생성자
        self.name = name		# 인스턴스 변수(고유 속성)
        self.age = age			# 인스턴스 변수(고유 속성)

    def info(self):
        return '{} is {} years old'.format(self.name, self.age)

    def speak(self, sound):
        return "{} says {}!".format(self.name, sound)


# 인스턴스화된 변수(객체 생성)

c = Dog2('july', 4)
d = Dog2('Marry', 10)


print(c.info())              

# 결과 : july is 4 years old


print(c.speak('Wal Wal'))

# 결과 : july says Wal Wal!

# 여기서 파라미터 self에는 인스턴스 변수 c가 자동으로 들어가기 때문에
# self.name은 july가 되지만, 파라미터 sound에는 speak( ) 함수의
# 전달인자가 들어가기 때문에, speak( ) 함수의 전달인자 값이 반드시 필요하다.
# 여기서는 전달인자 'Wal Wal'이 파라미터 sound에 들어간다.


print(d.speak("Mung Mung"))

# 결과 : Marry says Mung Mung!
# 위와 동일한 원리(d -> self, Marry -> self.name, "Mung Mung" -> sound)

'Python' 카테고리의 다른 글

Python - package  (0) 2021.10.18
Python - module  (0) 2021.10.18
Python - input  (0) 2021.10.15
Python - functions  (0) 2021.10.15
Python - while문  (0) 2021.10.14

댓글