250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- View
- inplace()
- fnmatch
- locals()
- __getitem__
- __len__
- mro()
- shuffle()
- node.js
- remove()
- fileinput
- JS
- zipfile
- 파이썬
- CSS
- HTML
- Database
- shutil
- choice()
- items()
- discard()
- randrange()
- glob
- 오버라이딩
- count()
- MySqlDB
- MySQL
- __annotations__
- decode()
- __sub__
Archives
- Today
- Total
흰둥이는 코드를 짤 때 짖어 (왈!왈!왈!왈!왈!왈!왈!왈!왈!왈!왈!)
(파이썬) 상속 본문
728x90
반응형
1. 상속
- 기존의 정의해둔 클래스의 기능을 그대로 물려받음
- 기존클래스에 기능 일부를 추가하거나, 변경하여 새로운 클래스를 정의함
- 코드 재사용할 수 있게 됨
- 안정적이고 유지보수에 용이함
- 상속을 받고자 하는 대상인 기존 클래스를 부모, parent, super, base 클래스라고 부름
- 상속을 받는 새로운 클래스는 자식, child, sub 클래스라고 부름
In [1]:
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self, food):
print(f'{self.name}는 {food}를 먹습니다.')
def sleep(self, hour):
print(f'{self.name}는 {hour}시간 동안 잠을 잡니다.')
In [3]:
animal = Animal('동물', 10)
animal.eat('먹이')
animal.sleep(14)
동물는 먹이를 먹습니다.
동물는 14시간 동안 잠을 잡니다.
In [4]:
class Dog(Animal): # Animal 클래스를 상속
pass
In [6]:
Rucy = Dog() # Animal 클래스의 생성자를 상속받았기 떄문에
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-6-b88989d1005b> in <module>
----> 1 Rucy = Dog() # Animal 클래스의 생성자를 상속받았기 떄문에
TypeError: __init__() missing 2 required positional arguments: 'name' and 'age'
In [7]:
Rucy = Dog('루시', 12)
In [8]:
Rucy.eat('사료')
루시는 사료를 먹습니다.
In [9]:
Rucy.sleep(10)
루시는 10시간 동안 잠을 잡니다.
2. 메소드 오버라이딩
- 부모 클래스의 method를 재정의
- 자식 클래스의 인스턴스로 호출시 재정의됨 메소드가 호출됨
In [10]:
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self, food):
print(f'{self.name}는 {food}를 먹습니다.')
def sleep(self, hour):
print(f'{self.name}는 {hour}시간 동안 잠을 잡니다.')
In [19]:
class Dog(Animal):
def run(self):
print(f'{self.name}는 달립니다')
def eat(self, food): # 메소드 오버라이딩
print(f'{self.name}는 {food}를 아주~ 맛있게 먹습니다')
def superEat(self, food):
super().eat(food)
In [20]:
Rucy = Dog('루시', 12)
Rucy.eat('사료')
Rucy.run()
루시는 사료를 아주~ 맛있게 먹습니다
루시는 달립니다
In [21]:
Rucy.eat('사료')
루시는 사료를 아주~ 맛있게 먹습니다
In [22]:
animal = Animal('동물', 10)
animal.eat('먹이')
animal.run() # 자식 클래스의 객체 메소드를 사용할 수 없음
동물는 먹이를 먹습니다.
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-22-6b47b6135896> in <module>
1 animal = Animal('동물', 10)
2 animal.eat('먹이')
----> 3 animal.run() # 자식 클래스의 객체 메소드를 사용할 수 없음
AttributeError: 'Animal' object has no attribute 'run'
In [23]:
Rucy.superEat('사료')
루시는 사료를 먹습니다.
3. 다중 상속
- C#, Java는 다중상속이 불가능
- 파이썬은 C++과 같이 다중상속이 가능
- 여러 클래스를 상속(개수 제한이 없음)
In [24]:
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self, food):
print(f'{self.name}는 {food}를 먹습니다.')
def sleep(self, hour):
print(f'{self.name}는 {hour}시간 동안 잠을 잡니다.')
In [25]:
class Human:
def __init__(self, name, age):
self.name = name
self.age = age
def study(self, hour):
print(f'{self.name}는 {hour}시간 동안 공부를 합니다')
In [26]:
class KimApple(Animal, Human):
pass
- 다중 상속시에는 생성자가 받는 매개변수가 같아야 하며 메소드명이 겹치면 에러가 발생한다.
In [27]:
kim = KimApple('김사과', 20)
In [28]:
kim.eat('밥')
김사과는 밥를 먹습니다.
In [29]:
kim.study(2)
김사과는 2시간 동안 공부를 합니다
In [30]:
KimApple.mro()
Out[30]:
[__main__.KimApple, __main__.Animal, __main__.Human, object]
- mro()는 해당 클래스가 어떤 부모 클래스들이 있는지 반환해주는 함수이다.
728x90
반응형
'파이썬 기초' 카테고리의 다른 글
(파이썬) 모듈 (0) | 2023.03.10 |
---|---|
(파이썬) 스페셜 메소드 (0) | 2023.03.10 |
(파이썬) 객체지향과 클래스 (0) | 2023.03.09 |
(파이썬) 랜덤 모듈 (0) | 2023.03.09 |
(파이썬) Callback 함수와 Lambda 함수 (0) | 2023.03.09 |
Comments