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 로 비워둔다.
'👩💻 도비는 공부중 > 📚 기초부터 차근차근' 카테고리의 다른 글
[C++/C#] Class | Struct (0) | 2023.07.25 |
---|