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