본문 바로가기

👩‍💻 도비는 공부중/📚 기초부터 차근차근

[Python] Class | Inheritance | Method Overriding | Abstract Class

Class, 객체(Object), Instance

class = 객체를 만들어내기 위한 틀!

객체는 클래스에서 선언된 틀 그대로 만들어진 실체, 고유한 상태, 이름, 행동을 가진다.

객체의 속성 = 멤버 변수

객체 속성에 영향을 주는 기능/행동 = 멤버 함수(메소드)

인스턴스: 클래스로 만든 객체 (크케 구분짓지 않고 사용하기도 하지만 약간의 차이점 ㅇㅇ)


Practice1.

class  클래스명:
	code

 

메소드는 함수와 동일하게 생성한다. 단, 메서드의 첫 번째 매개변수 = 반드시 self로 지정

- self: 인스턴스 자신을 의미

- 인스턴스 내부 속성을 다루기 위해 자신의 속성을 다룬다는 것을 알려주기 위해 필요

 

class 클래스명:
	def 메소드명(self, ...):
	    	method code

 

빈 클래스 생성 시 함수와 동일하게 pass 키워드 사용

class empty_c:
	pass

 

- 파이썬의 숫자 자료형, 리스트, 딕셔너리 모두 클래스!

 


 Practice 2.

복잡한 클래스 만들기

 

class Hello:
	def __init__(self):
    		self.msg = "Good Morning^^"
    def morning(self):
    		print(self.msg)
 
a = Hello()
a.morning() # Good Morning^^

 

__init__ 메소드는 클래스를 통해 개체를 생성하는 순간에 호출되는 특별한 생성자 메소드

 

class Person:
	def __init__(self, *args):
    		self.name = args[0]
            self.sex = args[1]
			self.age = args[2]
	def introduce(self):
    		print(f'이름: {self.name}')
            print(f'성별: {self.sex}')
            print(f'나이: {self.age}')
            
a = Person(*[coco', 'female', 20])

a.introduce()
# 이름: coco
# 성별: female
# 나이: 20

가변 인수, 키워드 인수 사용가능!

 

특정 인스턴스에만 속성 추가

클래스에 선언한 속성 이외로 생성된 객체에서 자신의 속성 속성 추가 가능

 


비공개 속성, 메소드(private attribute)

 

속성 이름 앞에 __ 추가

class Person:
    def __init__(self, name, sex, age, height):
        self.name = name
        self.sex = sex
        self.age = age
        self.__height = height
        
a = Person('coco', 'female', 20, 160)
a.age += 1
print(a.age) # 20
a.__height += 2 # AttributeError: 'Person' object has no attribute '__height'

비공개 속성 값을 변화시키려고 하면 에러 발생!

 


Class Inheritance

 

calss 자식 클래스명(부모 클래스 명):

class Family:
	lastname = "홍"
    def last_name(self):
    	print(f'last name: {self.lastname}')
        
class Person(Family):
	firstname = "길동"
    def first_name(self):
    	print(f'first name: {self.firstname}')
        
a = Family()
b = Person()

a.last_name()
b.first_name()
b.last_name
a.first_name()

 

부모 클래스의 속성 생성/초기화 하기 위해 부모의 __init__ 호출해야 하는데

자식 클래스 내의 __intit__ 에서 super().__init__() 의 형태로 호출하면 된다.

또는 super(자식 클래스 명. self) 로 사용 가능

 


Method Overriding

: 부모 클래스에 선언된 함수와 동일한 이름의 함수를 자식 클래스에서 재정의

 

super() 함수 사용해 원래 기능을 유지하면서 새로운 기능 추가 가능

 


Abstract Class

: 구현되지 않은 추상 메서드 하나 이상 가지고 있는 class

굳이?

 

부모 클래스를 만들 때, 자식 클래스에 특정 함수가 꼭 존재해야 하거나, 이름은 같지만 기능은 다른 함수를 만들고 싶을 때 유용

-> 자식 클래스에서 구현하지 않으면 객체 생성 시 에러 발생

 

from abc import *

class Family(metaclass=ABCMMeta):

	@abstracmethod
    def introduce(self):
    	pass

 

추상 클래스로는 인스턴스 생성할 수 없어 추상 method도 호출할 일이 없으므로 주로 pass 로 비워둔다.