layout: single
ํด๋์ค ์์(inheritance)
๊ธฐ๋ฐ ํด๋์ค์ ๋ฅ๋ ฅ์ ๊ทธ๋๋ก ํ์ฉํ๋ฉด์ ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉ
๋๋ฌผ์ ์๋ก ๋ค๋ฉด ์ฒ์ถ๋๋ฌผ์์ ํฌ์ ๋ฅ, ์กฐ๋ฅ, ํ์ถฉ๋ฅ ๋ฑ์ ๋ง๋๋ ์
๊ธฐ๋ฐํด๋์ค = ์ฒ์ถ๋๋ฌผ
ํ์ํด๋์ค = ํฌ์ ๋ฅ, ์กฐ๋ฅ
class ๊ธฐ๋ฐํด๋์ค์ด๋ฆ:
์ฝ๋
class ํ์ํด๋์ค์ด๋ฆ(๊ธฐ๋ฐํด๋์ค์ด๋ฆ):
์ฝ๋
#์ฌ๋(์์กฐ)์ค์ ํ์(์์์)์ด ์๋ ๊ฒ
class Person:
def greeting(self):
print('์๋
ํ์ธ์.')
class Student(Person):
def study(self):
print('๊ณต๋ถํ๊ธฐ')
james = Student()
james.greeting() # ์๋
ํ์ธ์.: ๊ธฐ๋ฐ ํด๋์ค Person์ ๋ฉ์๋ ํธ์ถ
james.study() # ๊ณต๋ถํ๊ธฐ: ํ์ ํด๋์ค Student์ ์ถ๊ฐํ study ๋ฉ์๋.
์๋
ํ์ธ์.
๊ณต๋ถํ๊ธฐ
ํด๋์ค ์์์ ๊ธฐ๋ฐ ํด๋์ค์ ๊ธฐ๋ฅ์ ์ ์งํ๋ฉด์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐ
# ์์๊ด๊ณ ํ์ธ
class Person:
pass
class Student(Person):
pass
issubclass(Student, Person)
True
# Student๊ฐ Person์ ํ์ ํด๋์ค์ด๋ฏ๋ก issubclass๋ True
์ด๋์ ์ฌ์ฉํด์ผ ํ ๊น?
class Person:
def greeting(self):
print('์๋
ํ์ธ์.')
class Student(Person):
def study(self):
print('๊ณต๋ถํ๊ธฐ')
class Person:
def greeting(self):
print('์๋
ํ์ธ์.')
class PersonList:
def __init__(self):
self.person_list = [] # ๋ฆฌ์คํธ ์์ฑ์ Person ์ธ์คํด์ค๋ฅผ ๋ฃ์ด์ ๊ด๋ฆฌ
def append_person(self, person): # ๋ฆฌ์คํธ ์์ฑ์ Person ์ธ์คํด์ค๋ฅผ ์ถ๊ฐํ๋ ํจ์
self.person_list.append(person)
# ์์์ ์ฌ์ฉํ์ง ์๊ณ ์์ฑ์ ์ธ์คํด์ค๋ฅผ ๋ฃ์ด์ ๊ด๋ฆฌํ๋ฏ๋ก PersonList๊ฐ Person์ ํฌํจ
๊ธฐ๋ฐํด๋์ค์ ๋ค์ด์๋ ์ธ์คํด์ค ์์ฑ ์ฌ์ฉ
class Person:
def __init__(self):
print('Person __init__')
self.hello = '์๋
ํ์ธ์.'
class Student(Person):
def __init__(self):
print('Student __init__')
self.school = 'ํ์ด์ฌ ์ฝ๋ฉ ๋์ฅ'
james = Student()
print(james.school)
print(james.hello) # ๊ธฐ๋ฐ ํด๋์ค์ ์์ฑ์ ์ถ๋ ฅํ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํจ
Student __init__
ํ์ด์ฌ ์ฝ๋ฉ ๋์ฅ
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/var/folders/nv/7gm32z8n6cz1dzxgymhz5lmh0000gn/T/ipykernel_17577/684535431.py in <module>
11 james = Student()
12 print(james.school)
---> 13 print(james.hello) # ๊ธฐ๋ฐ ํด๋์ค์ ์์ฑ์ ์ถ๋ ฅํ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํจ
AttributeError: 'Student' object has no attribute 'hello'
super()๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฐ ํด๋์ค์ int ๋ฉ์๋๋ฅผ ํธ์ถ
class Person:
def __init__(self):
print('Person __init__')
self.hello = '์๋
ํ์ธ์.'
class Student(Person):
def __init__(self):
print('Student __init__')
super().__init__() # super()๋ก ๊ธฐ๋ฐ ํด๋์ค์ __init__ ๋ฉ์๋ ํธ์ถ
self.school = 'ํ์ด์ฌ ์ฝ๋ฉ ๋์ฅ'
james = Student()
print(james.school)
print(james.hello)
Student __init__
Person __init__
ํ์ด์ฌ ์ฝ๋ฉ ๋์ฅ
์๋
ํ์ธ์.
๊ธฐ๋ฐ ํด๋์ค์ ์์ฑ์ ์ฐพ๋ ๊ณผ์
ํ์ ํด๋์ค์์ init ๋ฉ์๋๋ฅผ ์๋ตํ๋ค๋ฉด
๊ธฐ๋ฐ ํด๋์ค์ init์ด ์๋์ผ๋ก ํธ์ถ๋๋ฏ๋ก
super()๋ ์ฌ์ฉํ์ง ์์๋ ๋ฉ
class Person:
def __init__(self):
print('Person __init__')
self.hello = '์๋
ํ์ธ์.'
class Student(Person):
pass
james = Student()
print(james.hello)
Person __init__
์๋
ํ์ธ์.
ํ์ ํด๋์ค์์ ๊ธฐ๋ฐ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์๋ก ์ ์ํ๋ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ
# Person์ greeting ๋ฉ์๋๊ฐ ์๋ ์ํ์์ Student์๋ greeting ๋ฉ์๋๋ฅผ ๋ง๋ญ
class Person:
def greeting(self):
print('์๋
ํ์ธ์.')
class Student(Person):
def greeting(self):
print('์๋
ํ์ธ์. ์ ๋ ํ์ด์ฌ ์ฝ๋ฉ ๋์ฅ ํ์์
๋๋ค.')
james = Student()
james.greeting()
์๋
ํ์ธ์. ์ ๋ ํ์ด์ฌ ์ฝ๋ฉ ๋์ฅ ํ์์
๋๋ค.
class Person:
def greeting(self):
print('์๋
ํ์ธ์.')
class Student(Person):
def greeting(self):
super().greeting() # ๊ธฐ๋ฐ ํด๋์ค์ ๋ฉ์๋ ํธ์ถํ์ฌ ์ค๋ณต์ ์ค์
print('์ ๋ ํ์ด์ฌ ์ฝ๋ฉ ๋์ฅ ํ์์
๋๋ค.')
james = Student()
james.greeting()
์๋
ํ์ธ์.
์ ๋ ํ์ด์ฌ ์ฝ๋ฉ ๋์ฅ ํ์์
๋๋ค.
class ๊ธฐ๋ฐํด๋์ค์ด๋ฆ1:
์ฝ๋
class ๊ธฐ๋ฐํด๋์ค์ด๋ฆ2:
์ฝ๋
class ํ์ํด๋์ค์ด๋ฆ(๊ธฐ๋ฐํด๋์ค์ด๋ฆ1, ๊ธฐ๋ฐํด๋์ค์ด๋ฆ2):
์ฝ๋
class Person:
def greeting(self):
print('์๋
ํ์ธ์.')
class University:
def manage_credit(self):
print('ํ์ ๊ด๋ฆฌ') # ๊ธฐ๋ฐ ํด๋์ค Person๊ณผ University
class Undergraduate(Person, University):
def study(self):
print('๊ณต๋ถํ๊ธฐ')
# ํ์ ํด๋์ค Undergraduate๋ฅผ ๋ง๋ค ๋
# class Undergraduate(Person, University):์
# ๊ฐ์ด ๊ดํธ ์์ Person๊ณผ University๋ฅผ
# ์ฝค๋ง๋ก ๊ตฌ๋ถํด์ ๋ฃ์
# ์ด๋ ๊ฒ ํ๋ฉด ๋ ๊ธฐ๋ฐ ํด๋์ค์ ๊ธฐ๋ฅ์ ๋ชจ๋ ์์
james = Undergraduate()
james.greeting() # ์๋
ํ์ธ์. : ๊ธฐ๋ฐ ํด๋์ค Person์ ๋ฉ์๋ ํธ์ถ
james.manage_credit() # ํ์ ๊ด๋ฆฌ : ๊ธฐ๋ฐ ํด๋์ค University์ ๋ฉ์๋ ํธ์ถ
james.study() # ๊ณต๋ถํ๊ธฐ : ํ์ ํด๋์ค Undergraduate์ ์ถ๊ฐํ study ๋ฉ์๋
์๋
ํ์ธ์.
ํ์ ๊ด๋ฆฌ
๊ณต๋ถํ๊ธฐ
# ๋ค์๊ณผ ๊ฐ์ด Undergraduate ํด๋์ค์ ์ธ์คํด์ค๋ก
# Person์ greeting๊ณผ University์ manage_credit์ ํธ์ถํ ์ ์์
james = Undergraduate()
james.greeting() # ์๋
ํ์ธ์. : ๊ธฐ๋ฐ ํด๋์ค Person์ ๋ฉ์๋ ํธ์ถ
james.manage_credit() # ํ์ ๊ด๋ฆฌ : ๊ธฐ๋ฐ ํด๋์ค University์ ๋ฉ์๋ ํธ์ถ
james.study() # ๊ณต๋ถํ๊ธฐ : ํ์ ํด๋์ค Undergraduate์ ์ถ๊ฐํ study ๋ฉ์๋
์๋
ํ์ธ์.
ํ์ ๊ด๋ฆฌ
๊ณต๋ถํ๊ธฐ
Person, University, Undergraduate ํด๋์ค์ ๊ด๊ณ
class A:
def greeting(self):
print('์๋
ํ์ธ์. A์
๋๋ค.')
class B(A):
def greeting(self):
print('์๋
ํ์ธ์. B์
๋๋ค.')
class C(A):
def greeting(self):
print('์๋
ํ์ธ์. C์
๋๋ค.')
class D(B, C):
pass
x = D()
x.greeting() # ์๋
ํ์ธ์. B์
๋๋ค.
์๋
ํ์ธ์. B์
๋๋ค.
D.mro()
[__main__.D, __main__.B, __main__.C, __main__.A, object]
D์ ๋ฉ์๋ ํธ์ถ ์์๋
- ์๊ธฐ ์์ D,
- ๊ทธ ๋ค์์ด B์ ๋๋ค. ๋ฐ๋ผ์ D๋ก ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ greeting์ ํธ์ถํ๋ฉด B์ greeting์ด ํธ์ถ
x = D()
x.greeting() # ์๋
ํ์ธ์. B์
๋๋ค.
์๋
ํ์ธ์. B์
๋๋ค.
ํ์ด์ฌ์ ๋ค์ค ์์์ ํ๋ค๋ฉด class D(B, C):์ ํด๋์ค ๋ชฉ๋ก ์ค ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ ์์๋ก ๋ฉ์๋๋ฅผ ์ฐพ์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ฐ์ ๋ฉ์๋๊ฐ ์๋ค๋ฉด B๊ฐ ์ฐ์ ํฉ๋๋ค. ๋ง์ฝ ์์ ๊ด๊ณ๊ฐ ๋ณต์กํ๊ฒ ์ฝํ ์๋ค๋ฉด MRO๋ฅผ ์ดํด๋ณด๋ ๊ฒ์ด ํธ๋ฆฌ
from abc import *
class ์ถ์ํด๋์ค์ด๋ฆ(metaclass=ABCMeta):
@abstractmethod
def ๋ฉ์๋์ด๋ฆ(self):
์ฝ๋
# ํ์ ์ถ์ ํด๋์ค StudentBase๋ฅผ ๋ง๋ค๊ณ , ์ด ์ถ์ ํด๋์ค๋ฅผ ์์๋ฐ์ ํ์ ํด๋์ค Student
from abc import *
class StudentBase(metaclass=ABCMeta):
@abstractmethod
def study(self):
pass
@abstractmethod
def go_to_school(self):
pass
class Student(StudentBase):
def study(self):
print('๊ณต๋ถํ๊ธฐ')
james = Student()
james.study()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/var/folders/nv/7gm32z8n6cz1dzxgymhz5lmh0000gn/T/ipykernel_17577/186541337.py in <module>
15 print('๊ณต๋ถํ๊ธฐ')
16
---> 17 james = Student()
18 james.study()
TypeError: Can't instantiate abstract class Student with abstract methods go_to_school
์ถ์ ํด๋์ค StudentBase์์๋ ์ถ์ ๋ฉ์๋๋ก study์ go_to_school์ ์ ์ํ์ต๋๋ค. ํ์ง๋ง StudentBase๋ฅผ ์์๋ฐ์ Student์์๋ study ๋ฉ์๋๋ง ๊ตฌํํ๊ณ , go_to_school ๋ฉ์๋๋ ๊ตฌํํ์ง ์์์ผ๋ฏ๋ก ์๋ฌ๊ฐ ๋ฐ์
from abc import *
class StudentBase(metaclass=ABCMeta):
@abstractmethod
def study(self):
pass
@abstractmethod
def go_to_school(self):
pass
class Student(StudentBase):
def study(self):
print('๊ณต๋ถํ๊ธฐ')
def go_to_school(self):
print('ํ๊ต๊ฐ๊ธฐ')
james = Student()
james.study()
james.go_to_school()
๊ณต๋ถํ๊ธฐ
ํ๊ต๊ฐ๊ธฐ
james = StudentBase()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/var/folders/nv/7gm32z8n6cz1dzxgymhz5lmh0000gn/T/ipykernel_17577/1043146601.py in <module>
----> 1 james = StudentBase()
TypeError: Can't instantiate abstract class StudentBase with abstract methods go_to_school, study
์ง๊ธ๊น์ง ์ถ์ ๋ฉ์๋๋ฅผ ๋ง๋ค ๋ pass๋ง ๋ฃ์ด์ ๋น ๋ฉ์๋๋ก ๋ง๋ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ์ถ์ ํด๋์ค๋ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์์ผ๋ ์ถ์ ๋ฉ์๋๋ ํธ์ถํ ์ผ์ด ์๊ธฐ ๋๋ฌธ
@abstractmethod
def study(self):
pass # ์ถ์ ๋ฉ์๋๋ ํธ์ถํ ์ผ์ด ์์ผ๋ฏ๋ก ๋น ๋ฉ์๋๋ก ๋ง๋ฆ
@abstractmethod
def go_to_school(self):
pass # ์ถ์ ๋ฉ์๋๋ ํธ์ถํ ์ผ์ด ์์ผ๋ฏ๋ก ๋น ๋ฉ์๋๋ก ๋ง๋ฆ
์ถ์ ํด๋์ค๋ ์ธ์คํด์ค๋ก ๋ง๋ค ๋๋ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ ์ค๋ก์ง ์์์๋ง ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ ํด๋์ค์์ ๋ฐ๋์ ๊ตฌํํด์ผ ํ ๋ฉ์๋๋ฅผ ์ ํด ์ค ๋ ์ฌ์ฉ
print(type("string"))
print(type(1))
<class 'str'>
<class 'int'>
class TestClass:
pass
test_instance = TestClass()
test_instance1 = TestClass()
test_instance2 = TestClass()
test_instance3 = TestClass()
print(type(test_instance))
# <class '__main__.TestClass'>
<class '__main__.TestClass'>
class Musician:
title = "Rockstar"
๊ฐ๊ฐ ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ํธ์ถํด๋ ๊ฐ ์ธ์คํด์ค ์์ ์๋ title ๋ณ์๋ ๋๊ฐ์
drummer = Musician()
guitarist = Musician()
print(drummer.title)
print(guitarist .title)
Rockstar
Rockstar
class Musician:
title = "Rockstar"
def explanation(self):
print("I am a {}!".format(self.title))
drummer = Musician()
drummer.explanation()
#I am a Rockstar!
I am a Rockstar!
class Circle():
pi = 3.14
def area(self, radius):
return self.pi * radius ** 2
circle = Circle()
pizza_area = circle.area(6)
table_area = circle.area(18)
class Shouter:
def __init__(self):
print("HELLO?!")
shout = Shouter()
HELLO?!
class Circle:
pi = 3.14
def __init__(self, radius):
print("New circle with radius: {}".format(radius))
table = Circle(18)
New circle with radius: 18
Circle์ด๋ผ๋ ํด๋์ค์ ์์ฑ์ init์ ์ ์ดํด๋ณด๋ฉด self ๋ง๊ณ ๋ radius๋ผ๋ ์ธ์๋ฅผ ๋ฐ๋๋ค. ๊ทธ๋์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๊ดํธ ์์ ์ธ์๋ฅผ ๋ฃ์ด์ฃผ์ด์ผ ํจ
# ์ผ๋จ ํด๋์ค ์ ์ ๋๊ฐ์ ์ธ์คํด์ค ๋ถ๋ฌ์ค๊ธฐ
class FakeDict:
pass
fake_dict1 = FakeDict()
fake_dict2 = FakeDict()
# ๊ฐ ๊ฐ์ฒด์ fake_key๋ผ๋ ์ธ์คํด์ค ๋ณ์๋ก ๊ฐ๊ฐ ๋ค๋ฅธ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด
fake_dict1.fake_key = "This works!"
fake_dict2.fake_key = "This too!"
# ๋ณ๋๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅ
working_string = "{} {}".format(fake_dict1.fake_key, fake_dict2.fake_key)
print(working_string)
This works! This too!
class AutoEmail:
def __init__(self, name):
self.name = name
mail_to_park = AutoEmail("PARK")
mail_to_kim = AutoEmail("KIM")
print(mail_to_park.name)
# "PARK"
print(mail_to_kim.name)
# "KIM"
PARK
KIM
์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋ ์ด๋ฆ์ ๋ฃ์ด์ฃผ์๊ธฐ ๋๋ฌธ์ ๊ฐ ์ธ์คํด์ค์ name์์ ๊ทธ ์ด๋ฆ์ ๊ทธ๋๋ก ๊ฐ์ง๊ณ ์๊ฒ ๋จ
class AutoEmail:
intro = "์๋
ํ์ธ์"
def __init__(self, name):
self.name = name
def say_hello(self):
return "{intro} {name} ๋".format(intro=self.intro, name=self.name)
mail_to_park = AutoEmail("PARK")
mail_to_kim = AutoEmail("KIM")
print(mail_to_park.say_hello())
# "์๋
ํ์ธ์ PARK ๋"
print(mail_to_kim.say_hello())
# "์๋
ํ์ธ์ KIM ๋"
ํด๋์ค ๋ณ์์ ์ธ์คํด์ค ๋ณ์ ๋ชจ๋ ์์ ๋กญ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ