μλ΄: python-textbook.readthedocs.ioμ Classes λ΄μ©μ μμ½ λ° μμ ν λ΄μ©μ λλ€.
ν΄λμ€μμ μ μΈλ λ©μλλ μΈ μ’ λ₯λ‘ λλλ€.
self
μ¬μ© (κ΄λ‘)cls
μ¬μ© (κ΄λ‘)cls
μ§μ μμ ν¨κ» μ¬μ© κ°λ₯
λ¨, μΈμ€ν΄μ€ μμ± μ¬μ© λΆκ°.ν΄λμ€ λ©μλμ μ μ λ©μλλ νμ μ₯μμμ ν¨κ» μ μΈλμ΄μΌ νλ€.
λ°λ©΄μ self
λ₯Ό 첫째 맀κ°λ³μλ‘ μ¬μ©νλ μΈμ€ν΄μ€ λ©μλλ νΉλ³ν μ₯μμκ° νμ μλ€.
μλ₯Ό λ€μ΄,
μ½λ μΆμν: ν΄λμ€μ κ°μ²΄ 1λΆμμ
μ΄ν΄λ³Έ λͺ¨λ λ©μλλ μΈμ€ν΄μ€ λ©μλμ΄λ€.
μ₯μμ(decorator)λ λ€λ₯Έ ν¨μμ κΈ°λ₯μ λ€λ₯Έ κΈ°λ₯μ μΆκ°ν λ μ¬μ©λλ ν¨μμ΄λ€. μ¦, μ₯μμλ ν¨μλ₯Ό μΈμλ‘ λ°μ κ·Έ ν¨μκ° νλ μΌμ λν΄ λ€λ₯Έ κΈ°λ₯λ μννλ ν¨μλ₯Ό 리ν΄κ°μΌλ‘ λ΄μ€λ€. μ΄λ° μ₯μμλ₯Ό ν¨μλ‘ μ μν μ μλ μ΄μ λ ν¨μκ° μ 1μ’ κ°μ²΄μ΄κΈ° λλ¬Έμ΄λ€. μ¦, λ€λ₯Έ ν¨μμ μΈμ λλ 리ν΄κ°μΌλ‘ μ¬μ©λ μ μλ€.
μ°Έκ³ : μ₯μμλ₯Ό κΈ°μ‘΄μ ν¨μμ μ μ©ν μΆκ°κΈ°λ₯μ μ 곡νμ¬ ν¬μ₯νλ€λ μλ―Έμμ λνΌ(wrapper)μ μΌμ’ μΌλ‘ κ°μ£Όνλ€.
νμ΄μ¬μμ κΈ°λ³ΈμΌλ‘ μ 곡νλ μ₯μμκ° λ§€μ° λ€μνλ©°, μ¬μ©μκ° μ§μ μ₯μμλ₯Ό μ μν μλ μλ€.
μ¬κΈ°μλ ν΄λμ€μμ μ μΈλ λ©μλμ μ’
λ₯λ₯Ό ꡬλΆνκΈ° μν΄ μ¬μ©λλ
λ κ°μ μ₯μμ
@classmethod
μ @staticmethod
λ₯Ό μκ°νλ€.
@classmethod
¶ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μμλ ν΄λμ€ μ΄λ¦κ³Ό ν¨κ» μ¬μ©ν μ μλ
λ©μλλ₯Ό ν΄λμ€ λ©μλ(class method)λΌ λΆλ₯΄λ©°,
@classmethod
λΌλ μ₯μμμ ν¨κ» μ μΈλλ€.
@classmethod
def ν¨μμ΄λ¦(cls,μΈμ1, ..., μΈμk):
λ³Έλ¬Έ
ν΄λμ€ λ©μλ μμ 첫째 μΈμλ‘ ν΄λΉ ν΄λμ€λ₯Ό λ°μ μ€λΉλ₯Ό νλ 맀κ°λ³μλ₯Ό λ°λμ μ¬μ©ν΄μΌ νλ€.
νμ§λ§ self
λμ μ ν΄λμ€(class) μ체λ₯Ό κ°λ¦¬ν¨λ€λ μλ―Έλ‘ cls
λ₯Ό κ΄λ‘μ μΌλ‘ μ¬μ©νλ€.
ν΄λμ€ λ©μλλ₯Ό νΈμΆνλ©΄ cls
μ ν΄λΉ ν΄λμ€ μ΄λ¦μ΄ μλμΌλ‘ μ½μ
λλ€.
λ°λΌμ ν΄λμ€ λ©μλλ₯Ό νΈμΆν λ 첫째 μΈμλ μλ΅νλ€.
ν΄λμ€ λ©μλλ₯Ό μ μΈν λ μ¬μ©λλ cls
맀κ°λ³μλ ν΄λμ€ μμ μ κ°λ¦¬ν€λ
μ§μ μ μν μ μννλ€.
λ°λΌμ ν΄λμ€ λ©μλ λ΄λΆμμλ μΈμ€ν΄μ€ μμ±κ³Ό μΈμ€ν΄μ€ λ©μλλ₯Ό νμ©νμ§ λͺ»νλ€.
ν΄λμ€ λ©μλλ₯Ό μ¬μ©νλ μ΄μ λ ν¬κ² λ κ°μ§μ΄λ€.
첫째, μμ(constant) μν μ μννλ κ°μ΄λ ν΄λμ€ μμ±μ μ§μ νμ©νκ³ μ ν λ μ μ©νλ€. μ΄λ μμμ ν΄λμ€ μμ±μ νμ©νκΈ° μν΄ νΉμ κ°μ²΄κ° νμνμ§ μκΈ° λλ¬Έμ΄λ€. λν κ²½μ°μ λ°λΌ μ°κ΄λ μμλ ν¨μλ€μ νλλ‘ ν΄λμ€λ‘ λ¬Άμ΄μ νμ©ν μλ μλ€. μ΄λ° κ²½μ° κ΅³μ΄ κ°μ²΄λ₯Ό μμ±ν νμκ° μλ€.
class Title:
TITLES = ('Dr', 'Mr', 'Mrs', 'Ms')
@classmethod
def allowed_titles_starting_with(cls, startswith):
# startwithλ‘ μμνλ νμ΄ν μ°ΎκΈ°
return [t for t in cls.TITLES if t.startswith(startswith)]
@classmethod
def allowed_titles_ending_with(cls, endswith):
# endswithλ‘ λλλ νμ΄ν μ°ΎκΈ°
return [t for t in cls.TITLES if t.endswith(endswith)]
print(Title.allowed_titles_starting_with("M"))
print(Title.allowed_titles_ending_with("s"))
μ μ½λλ₯Ό PythonTutor: ν΄λμ€ μ₯μμ μμ 1μμ μ€ννλ©΄μ νμΈν μ μλ€.
λμ§Έ, 리ν΄κ°μΌλ‘ ν΄λΉ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±νλ ν΄λμ€ λ©μλλ₯Ό μ¬μ©νλ κ²½μ°κ° μ’
μ’
μλ€.
μ΄λ κ² νλ©΄ ν΄λΉ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±νκΈ° μν μ€λΉμ¬νμ μ΄ ν΄λμ€ λ©μλκ° μμμ μ²λ¦¬ν΄μ€λ€.
μλ₯Ό λ€μ΄, μλ Person
ν΄λμ€μ fromDict
λ©μλλ
νΉμ ν
μ€νΈ νμΌμ μ μ₯λ μ 보λ₯Ό νμΈν ν κ·Έ μ 보λ₯Ό μ μ ν νμ©νμ¬
Person
ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±ν΄μ€λ€.
class Person:
def __init__(self, name, surname):
self.name = name
self.surname = surname
@classmethod
def fromDict(cls, nameDict):
# {'μ΄λ¦': 'Jane', 'μ±': 'Doe'} νμμ μ¬μ μλ£νμμ
# μ΄λ¦κ³Ό μ± μ 보λ₯Ό μΆμΆν΄μ Person ν΄λμ€ κ°μ²΄ μμ±
params = nameDict.values()
return cls(*params)
janeDoe = {'μ΄λ¦':'Jane', 'μ±':'Doe'}
jDoe = Person.fromDict(janeDoe)
print(jDoe.name)
print(jDoe.surname)
μ μ½λλ₯Ό PythonTutor: ν΄λμ€ μ₯μμ μμ 2μμ μ€ννλ©΄μ νμΈν μ μλ€.
@staticmethod
¶μ μ λ©μλλ ν΄λμ€λ μΈμ€ν΄μ€λ₯Ό μ§μ νλ μΈμλ₯Ό μ¬μ©νμ§ μλλ€. λ°λΌμ μΌλ° ν¨μλ₯Ό μ μΈνλ κ²κ³Ό μλ²½νκ² λμΌνλ€. λ€λ§, ν΄λμ€ λ΄λΆμμ μ μΈλμκΈ° λλ¬Έμ νμ ν΄λΉ ν΄λμ€μ μ΄λ¦μ μ§μ μλ‘ μ¬μ©νμ¬ νΈμΆλλ€. λν μ μ λ©μλμ λ³Έλ¬Έμμ ν΄λΉ ν΄λμ€μ μΈμ€ν΄μ€ μμ±κ³Ό μΈμ€ν΄μ€ λ©μλλ νμ©λ μ μλ€. λ°λ©΄μ μΈμ€ν΄μ€ λ©μλλ ν΄λμ€ λ©μλμ μ μ λ©μλλ₯Ό λͺ¨λ νμ©ν μ μλ€.
κ²°λ‘ μ μΌλ‘, ν΄λμ€ λ©μλμ μ μΈ λ° νμ© λ°©μκ³Ό κ±°μ λμΌνλ€.
λ€λ§, μ μ λ©μλλ ν΄λμ€λ₯Ό μ§μ ν λ cls
λμ μ ν΄λΉ ν΄λμ€μ μ΄λ¦μ μ§μ
μΈκΈν΄μΌ νλ€λ μ°¨μ΄μ μ΄ μμ λΏμ΄λ€.
μλ μμ κ° μΈ μ’
λ₯μ λ©μλ νμ©λ²μ μ 보μ¬μ€λ€.
class Person:
TITLES = ('Dr', 'Mr', 'Mrs', 'Ms')
def __init__(self, name, surname):
self.name = name
self.surname = surname
# μΈμ€ν΄μ€ λ©μλ
def fullname(self):
return f"{self.name} {self.surname}"
# ν΄λμ€ λ©μλ
@classmethod
def allowed_titles_starting_with(cls, startswith):
return [t for t in cls.TITLES if t.startswith(startswith)]
# μ μ λ©μλ
@staticmethod
def allowed_titles_ending_with(endswith):
return [t for t in Person.TITLES if t.endswith(endswith)]
jane = Person("Jane", "Smith")
print(jane.fullname())
print(jane.allowed_titles_starting_with("M"))
print(Person.allowed_titles_starting_with("M"))
print(jane.allowed_titles_ending_with("s"))
print(Person.allowed_titles_ending_with("s"))
μ μ½λλ₯Ό PythonTutor: μ₯μμ μμ μμ μ€ννλ©΄μ νμΈν μ μλ€.
Numbers
λ₯Ό μ μνλΌ. MULTIPLIER
: ν΄λμ€ μμ±__init__
λ©μλ: μ«μ λ κ°λ₯Ό μ
λ ₯λ°μ κ°κ° μΈμ€ν΄μ€ μμ± x
μ y
λ‘ μ μ₯.add
: μΈμ€ν΄μ€ λ©μλ. x
μ y
μ ν© λ΄μ£ΌκΈ°multiply
: ν΄λμ€ λ©μλ. νλμ μ«μ a
λ₯Ό μ
λ ₯ λ°μ MULTIPLIER
μ κ³±μΌ κ²°κ³Ό λ΄μ£ΌκΈ°subtract
: μ μ λ©μλ. b
μ c
μ«μ λ κ°λ₯Ό μ
λ ₯ λ°μ b-c
λ΄μ£ΌκΈ°class Numbers:
MULTIPLIER = 3.5
def __init__(self, x, y):
self.x = x
self.y = y
def add(self):
return self.x + self.y
@classmethod
def multiply(cls, a):
return cls.MULTIPLIER * a
@staticmethod
def subtract(b, c):
return b - c
twoAndfive = Numbers(2,5)
print(twoAndfive.add())
print(Numbers.multiply(4))
print(twoAndfive.multiply(4))
print(Numbers.subtract(7, 2))
print(twoAndfive.subtract(7,2))
object
클래스와 매직 메서드¶μμ±λ κ°μ²΄μ κ΄λ ¨λ μμ±κ³Ό λ©μλλ₯Ό νμΈνλ €λ©΄ dir
ν¨μλ₯Ό νμ©νλ€.
μλ₯Ό λ€μ΄, λ€μ Person
ν΄λμ€μ μΈμ€ν΄μ€μΈ jane
μ μμ±ν΄λ³΄μ.
class Person:
def __init__(self, name, surname):
self.name = name
self.surname = surname
def fullname(self):
return f"{self.name} {self.surname}"
jane = Person("Jane", "Smith")
μ΄μ dir
ν¨μλ₯Ό μ΄μ©νμ¬ jane
μ΄ κ°λ¦¬ν€λ κ°μ²΄μ μμ±κ³Ό λ©μλλ₯Ό νμΈν΄λ³΄μ.
dir(jane)
object
¶λλκ²λ Person
ν΄λμ€λ₯Ό μ μΈν λ λͺ
μλ μμ±κ³Ό λ©μλ μ΄μΈμ
μΆκ°λ‘ λ§μ μ΄λ¦μ΄ 보μΈλ€.
μ΄μ λ λ€μκ³Ό κ°λ€.
object
λΌλ ν΄λμ€λ₯Ό μμνλ€.object
ν΄λμ€μλ μμμ μΈκΈλ, μ΄μ€ λ°μ€λ‘ κ°μΈμΈ μμ±κ³Ό λ©μλκ° μ μΈλμ΄ μλ€.μμμ λμμΈ ν΄λμ€λ₯Ό μμ ν΄λμ€(superclass) λλ λΆλͺ¨ ν΄λμ€(parent class),
μμνλ ν΄λμ€λ₯Ό νμ ν΄λμ€(subclass) λλ μμ ν΄λμ€(child class)
λΌκ³ λΆλ₯Έλ€.
μ΄λ° μλ―Έμμ object
λ μ΅μμμ μμΉν ν΄λμ€μ΄λ€.
object
ν΄λμ€μ ν¬ν¨λ μμ±κ³Ό λ©μλλ λͺ¨λ μλμ΄ μ΄μ€ λ°μ€λ‘ κ°μΈμ΄λ©°,
object
ν΄λμ€μ λ©μλλ₯Ό νΉλ³ν λ§€μ§ λ©μλ(magic method)λΌ λΆλ₯Έλ€.
λ°λΌμ μμμ ν΄λμ€λ object
ν΄λμ€μμ μ μΈλ λ§€μ§ λ©μλμ μμ±μ
λͺ¨λ μμλ°λλ€.
Person
ν΄λμ€λ₯Ό μλ°ν μ μνλ €λ©΄ λ€μκ³Ό κ°μ΄ μμνλ object
ν΄λμ€λ₯Ό
λͺ
μν΄μΌ νλ€.
νμ§λ§ μμ λμμ΄ object
ν΄λμ€ λΏμΈ κ²½μ° λͺ
μνμ§ μμλ λλ©°,
κ΄νΈλ μλ΅νλ€.
class Person(object):
def __init__(self, name, surname):
self.name = name
self.surname = surname
def fullname(self):
return f"{self.name} {self.surname}"
μ£Όμ: νμ΄μ¬ 2μμλ object
λ₯Ό λ°λμ λͺ
μν΄μΌ νλ€.
μμμ λν΄μλ μΌλ¨ μ΄ μ λλ§ μκ³ μμΌλ©΄ λλ©°, λ³΄λ€ μμΈν μ€λͺ
μ
μΆν λ€λ£¬λ€.
object
클래스의 속성과 매직 메서드 기능¶μ΄κΈ° μ€μ λ©μλ __init__
λ κ΅³μ΄ μ μΈλ νμκ° μλ€κ³ μμ μΈκΈνμλλ°,
κ·Έ μ΄μ κ° λ°λ‘ μμνλ λΆλͺ¨ ν΄λμ€μ __init__
λ©μλκ° μλμΌλ‘ μ¬μ©λκΈ° λλ¬Έμ΄λ€.
νμ§λ§ μμ κ°μ΄ __init__
λ©μλλ₯Ό μ μΈνλ©΄ μλ‘ μ μλ ν¨μκ° μ¬μ©λλ€.
μ°Έκ³ : object
ν΄λμ€μ __init__
λ©μλμ κΈ°λ³Έ κΈ°λ₯μ
μ무 μΌλ νμ§ μλ κ²μ΄λ€.
λͺ¨λ λ§€μ§ λ©μλλ κ³ μ μ κΈ°λ₯μ μννλ€. λ°λΌμ, νΉλ³ν μ¬μ κ° μμΌλ©΄ λ§€μ§ λ©μλλ₯Ό λ€μ μ μνλ μΌμ νΌν΄μΌ νλ€. μ¬κΈ°μλ μ£Όμ λ§€μ§ λ©μλμ κΈ°λ³Έ κΈ°λ₯μ κ°λ΅νκ² νμΈνλ€.
__repr__
메서드와 __str__
메서드¶μ«μ, λ¬Έμμ΄, 리μ€νΈ, νν, μ¬μ λ±μ νμΈνκ±°λ μΆλ ₯νλ©΄ μ°λ¦¬μκ² λ§€μ° μΉμν λ°©μμΌλ‘ 보μ¬μ§λ€. μλ₯Ό λ€μ΄, 리μ€νΈμ κ²½μ°λ κ°μ νμΈνλ κ±°μ μΆλ ₯νλ λ°μ μ°¨μ΄κ° μλ€.
[1, 2, 3]
print([1, 2, 3])
λ°λ©΄μ λ¬Έμμ΄μ κ²½μ°λ μ‘°κΈ λ€λ₯΄λ€.
"νμ΄μ¬μ΄ μ΅κ³ μμ!"
print("νμ΄μ¬μ΄ μ΅κ³ μμ!")
μ΄λ κ² μλνλ μ΄μ λ λ¬Έμμ΄ ν΄λμ€μ λ΄λΆμμ
__repr__
κ³Ό __str__
λ λ©μλκ° μ‘°κΈ λ€λ₯΄κ² μ μλμ΄ μκΈ° λλ¬Έμ΄λ€.
κ°μ νμΈν λλ __repr__
λ©μλκ° νΈμΆλκ³ ,
μΆλ ₯ν λλ __str__
λ©μλκ° νΈμΆλλ€.
"νμ΄μ¬μ΄ μ΅κ³ μμ!".__repr__()
μμ μΈμ©λΆνΈκ° ν¬ν¨λ λ¬Έμμ΄μ΄ 리ν΄κ°μ΄λ€.
λ°λ©΄μ __str__
λ©μλμ κ²½μ° μμ μΈμ©λΆνΈλ ν¬ν¨λμ§ μμ λ¬Έμμ΄μ΄ μ¬μ©λμλ€.
"νμ΄μ¬μ΄ μ΅κ³ μμ!".__str__()
μ΄μ jane
κ°μ²΄λ₯Ό νμΈνκ³ μΆλ ₯ν΄λ³΄μ.
jane
print(jane)
λ κ²½μ° μμ£Ό μ‘°κΈ λ€λ₯΄κΈ°λ νμ§λ§ κΈ°λ³Έμ μΌλ‘ λμΌν μ 보λ₯Ό 보μ¬μ€λ€.
보μ¬μ§λ μ 보λ jane
μ΄ Person
ν΄λμ€μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€λ μ¬μ€κ³Ό
ν΄λΉ κ°μ²΄κ° μ μ₯λμ΄ μλ λ©λͺ¨λ¦¬μ μ£Όμμ΄λ€.
μ΄λ κ² λμ€λ μ΄μ λ Person
ν΄λμ€μμ __repr__
, __str__
λͺ¨λ
μ μλμ΄ μμ§ μκΈ° λλ¬Έμ΄λ€.
μ΄μ Person
ν΄λμ€μμ __repr__
, __str__
λ λ©μλλ₯Ό λ€μκ³Ό κ°μ΄ μ¬μ μν΄λ³΄μ.
λ λ©μλ λͺ¨λ 리ν΄κ°μ λ¬Έμμ΄μ΄μ΄μΌ νλ€.
class Person(object):
def __init__(self, name, surname):
self.name = name
self.surname = surname
def fullname(self):
return f"{self.name} {self.surname}"
def __str__(self):
return f"μ±: {self.surname}, μ΄λ¦: {self.name}"
def __repr__(self):
return f"Person(μ±: {self.surname}, μ΄λ¦: {self.name})"
jane = Person("Jane", "Smith")
μ΄μ λ€μ jane
μ νμΈνκ³ μΆλ ₯ν΄λ³΄μ.
# __repr__ λ©μλ μ¬μ©λ¨.
jane
# __str__ λ©μλ μ¬μ©λ¨.
print(jane)
μ£Όμ: __str__
λ©μλκ° μ¬μ μλμ΄ μμ§ μμ κ²½μ°,
__repr__
λ©μλμ μ μλ₯Ό μ¬μ©νλ€.
class Person(object):
def __init__(self, name, surname):
self.name = name
self.surname = surname
def fullname(self):
return f"{self.name} {self.surname}"
def __repr__(self):
return f"Person(μ±: {self.surname}, μ΄λ¦: {self.name})"
jane = Person("Jane", "Smith")
jane
print(jane)
__repr__
λ©μλμ __str__
λ©μλλ κΈ°λ³Έμ μΌλ‘ λΉμ·ν μ©λλ‘ μ¬μ©λλ€.
μ°¨μ΄μ μ __str__
λ©μλλ κ°μ²΄λ€μ μ μ νκ² νλ©΄μ μΆλ ₯νλ λ°μ μ¬μ©λλ©°,
__repr__
λ©μλλ κ°μ²΄λ€μ μ’ λ νμμ κ°μΆμ΄ μ λ¬ ν λ μ¬μ©νλ€.
μ λ¬ λλ κ°μ λ€λ₯Έ ν¨μ λ±μ μν΄ νμ©λκΈ° λλ¬Έμ μ μ ν μ 보λ₯Ό λ΄κ³ μλ κ² μ’λ€.
μλ₯Ό λ€μ΄, μκ°κ³Ό κ΄λ ¨λ datetime
λͺ¨λμ date
ν΄λμ€μ
datetime
ν΄λμ€ κ°μ²΄λ₯Ό μ΄μ©νμ¬ λ ν¨μκ° λ€λ₯΄κ² μλνλ κ²μ μ΄ν΄λ³΄μ.
μλ μμ μμλ repr
μ str
λ ν¨μλ₯Ό μκ°νλ©΄μ λ λ©μλμ
μ°¨μ΄μ μ μ€λͺ
νλ€.
repr
ν¨μλ₯Ό νΈμΆνλ©΄ μΈμλ‘ μ¬μ©λ κ°μ __repr__
λ©μλκ°,
λ°λ©΄μ str
ν¨μλ₯Ό νΈμΆνλ©΄ μΈμλ‘ μ¬μ©λ κ°μ __str__
λ©μλκ° νΈμΆλλ€.
import datetime
# datetime κ°μ²΄: νμ¬ μκ° μ 보 μ μ₯
now = datetime.datetime.now()
# date κ°μ²΄: νμ¬ λ μ§ μ 보 μ μ₯
today = datetime.date.today()
repr
ν¨μλ ν¨μ¬ νμμ κ°μΆ ννμ μ¬μ©νλ€.
repr(now)
repr(today)
λ°λ©΄μ str
ν¨μλ κ°μνλ ννμ μ¬μ©νλ€.
str(now)
str(today)
__lt__
메서드¶μ½λ μΆμν: ν΄λμ€μ κ°μ²΄ 1λΆμμ
νμ©ν datetime
λͺ¨λμ date
ν΄λμ€μ κ°μ²΄λ€μ λν΄ ν¬κΈ° λΉκ΅λ₯Ό νμλ€.
μ΄μ μ μ¬μ©λμλ μ½λμ μΌλΆλ λ€μκ³Ό κ°μΌλ©°, 1992λ
3μ 12μΌ μμ λ§λμ΄λ₯Ό κ³μ°νκ³ μλ€.
κ·Έλ°λ° if
쑰건문μμ μ€λ λ μ§μ μ¬ν΄ μμΌ λ μ§μ ν¬κΈ° λΉκ΅λ₯Ό νκ³ μλ€.
import datetime
birthdate = datetime.date(1992,3,12)
today = datetime.date.today()
age = today.year - birthdate.year
if today < datetime.date(today.year, birthdate.month, birthdate.day):
age -= 1
print(f"λ§ {age}μΈ")
date
ν΄λμ€μ κ°μ²΄λ€ μ¬μ΄μ ν¬κΈ° λΉκ΅κ° κ°λ₯νλ©°,
μΌλ°μ μΈ λ μ§ κΈ°μ€μ ν¬κΈ°λ₯Ό μ¬μ©νκ³ μλ€.
νμ§λ§ λͺ¨λ ν΄λμ€μ κ°μ²΄λ€μ ν¬κΈ° λΉκ΅κ° νμ κ°λ₯ν κ²μ μλλ€.
ν΄λΉ ν΄λμ€μ __lt__
λ©μλκ° κ΅¬νλμ΄ μμ λλ§ κ°λ₯νλ€.
(ltλ less thanμ μ€μλ§μ)
μλ₯Ό λ€μ΄, Person
ν΄λμ€μ κ°μ²΄λ€μ μλ‘ λΉκ΅ν μ μλ€.
scotty = Person("Scotty", "Wing")
scotty.fullname()
'scotty'μ 'jane'μ ν¬κΈ°λ₯Ό λΉκ΅νλ©΄ μ€λ₯κ° λ°μνλ€.
scotty < jane
μ΄μ Person
ν΄λμ€μ κ°μ²΄λ₯Ό μ΄λ¦ μμΌλ‘ ν¬κΈ°λΉκ΅λ₯Ό νλλ‘ λ§λ€κΈ° μν΄
__lt__
λ©μλλ₯Ό ꡬννμ. ν¬κΈ° λΉκ΅λ μ΄λ¦ μμΌλ‘ μ νλ€.
λ¬Έμμ΄λ€μ λΉκ΅κ° μνλ²³ μμλ‘ κ²°μ λλ κ²μ νμ©νλ€.
μ°Έκ³ :, __lt__
λ©μλλ μμ κ³Ό λ€λ₯Έ Person
ν΄λμ€μ κ°μ²΄μμ λΉκ΅μ΄λ―λ‘
self
μ΄μΈμ μΆκ°λ‘ νλ λ 맀κ°λ³μλ₯Ό μ¬μ©νλ€.
λμΌ ν΄λμ€μ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ λ³μλ κ΄μ©μ μΌλ‘ other
λΌλ μ΄λ¦μ μ¬μ©νλ€.
λ¬Όλ‘ μ무μ¬νμ μλλ€.
class Person(object):
def __init__(self, name, surname):
self.name = name
self.surname = surname
def fullname(self):
return f"{self.name} {self.surname}"
def __repr__(self):
return f"Person(μ±: {self.surname}, μ΄λ¦: {self.name})"
def __lt__(self, other):
if self.surname < other.surname:
return True
elif self.surname == other.surname:
if self.name < other.name:
return True
else:
return False
else:
return False
jane = Person("Jane", "Smith")
scotty = Person("Scotty", "Wing")
μ΄μ Person
ν΄λμ€μ λ κ°μ²΄μ ν¬κΈ°λ₯Ό λΉκ΅ν μ μλ€.
ν¬κΈ° λΉκ΅λ μΌλ°μ μΌλ‘ μλ €μ§ <
μ°μ°μλ₯Ό μ¬μ©νλ€.
jane < scotty
μ μ½λλ μ€μ λ‘ μλ μ½λμ μΌμ νλ€.
jane.__lt__(scotty)
__lt__
κ° μ μλλ©΄ >
μ°μ°μλ μλμΌλ‘ μ¬μ©μ΄ κ°λ₯νλ€.
>
μ°μ°μλ __gt__
λ©μλμ ν΄λΉνλ€.
(gtλ greater thanμ μ€μλ§μ)
jane > scotty
νμ§λ§ μμ§μ <=
μ >=
λ μ¬μ©ν μ μλ€.
μ΄μ λ λ κ°μ²΄ μ¬μ΄μ λμΉμ±(equivalence)μ΄ μ μλμ§ μμκΈ° λλ¬Έμ΄λ€.
μ¦, __eq__
λ©μλκ° κ΅¬νλμ΄ μμ§ μλ€.
λ±μμ λν μ€λͺ
μ μλ μ°μ΅λ¬Έμ μμ λΆμ ν΄λμ€λ₯Ό μ μΈν λ μμΈν μ΄ν΄λ³Ό κ²μ΄λ€.
__class__
속성¶κ°μ²΄μ μλ£νμ νμΈν λ type
ν¨μλ₯Ό μ¬μ©νλ€.
κ·Έλ¬λ©΄ type
ν¨μλ ν΄λΉ κ°μ²΄μ __class__
μμ±μ νμΈνμ¬ μ λ¬νλ€.
jane.__class__
type(jane)
[1, 2, 3].__class__
type([1, 2, 3])
__dict__
속성¶__dict__
μμ±μ μΈμ€ν΄μ€ μμ±λ€μ μ¬μ μΌλ‘ λͺ¨μ λλ€.
jane.__dict__
μ¦, __dict__
λ ν΄λΉ μΈμ€ν΄μ€μ λͺ¨λ μμ±μ μ¬μ μλ£νμΌλ‘ ν¬ν¨νλ€.
ν€λ μμ± λ³μ, κ°μ μμ± κ°μ μ¬μ©νλ€.
μ£Όμ: 리μ€νΈλ μΈμ€ν΄μ€ μμ±μ μ ν κ°μ§ μλλ€.
[1, 2, 3].__dict__
__iter__
메서드¶λ¦¬μ€νΈ, νν, λ¬Έμμ΄, μ¬μ λ±μ μ΄ν°λ¬λΈ(iterable) μλ£νμ μνλ€.
μ΄ν°λ¬λΈ μλ£νμ for
λ°λ³΅λ¬Έκ³Ό ν¨κ» μ¬μ©λ μ μλ μλ£νμ΄λΌκ³ μκ°νλ©΄ μ½κ²
μ΄ν΄ν μ μλ€.
λ³΄λ€ μλ°ν λ§νλ©΄ __iter__
λ©μλκ° μ μλμ΄ μλ μλ£νμ΄ μ΄ν°λ¬λΈ μλ£νμ΄λ€.
μ€μ λ‘ λͺ¨λ 리μ€νΈ, νν, λ¬Έμμ΄μ ν΄λΉ λ©μλλ₯Ό ν¬ν¨νκ³ μλ€.
μ£Όμ: __iter__
λ©μλλ object
μ ν¬ν¨λμ΄ μμ§ μλ€.
[1, 2, 3].__iter__()
(1, 2, 3).__iter__()
'1, 2, 3'.__iter__()
__iter__
λ©μλμ μν μ ν΄λΉ μλ£νμ μ΄ν°λ μ΄ν°(iterator)λ‘
λ³νμν€λ μΌμ΄λ€.
μ΄ν°λ μ΄ν°λ __next__
λ©μλλ₯Ό ν¬ν¨νλ μλ£νμ΄λ€.
ν΄λΉ λ©μλλ, μλ₯Ό λ€μ΄, for
λ°λͺ©λ¬Έμμ κ° νλͺ©μ νμ©ν λ μ¬μ©λλ€.
리μ€νΈ [1, 2, 3]
μ μ΄μ©νλ μλ₯Ό μ΄ν΄λ³΄μ.
aList = [1, 2, 3]
iter
ν¨μλ₯Ό μ¬μ©νλ©΄ __iter__
λ©μλκ° μ¬μ©λλ€.
aIterator = iter(aList)
μ΄μ next
ν¨μλ₯Ό νΈμΆνλ©΄ __next__
λ©μλκ° νΈμΆλλ€.
next(aIterator)
next
ν¨μλ₯Ό νΈμΆν λλ§λ€ 리μ€νΈμ λ€μ νλͺ©μ΄ νμΈλλ€.
next(aIterator)
next(aIterator)
λ§μ§λ§ νλͺ©μ΄ νμΈλ νμλ StopIteration
μ€λ₯κ° λ°μνλ€.
next(aIterator)
next
ν¨μλ₯Ό λ€μ μ¬μ©νλ €λ©΄ μ΄ν°λ μ΄ν°λ₯Ό λ€μ μμ±ν΄μΌ νλ€.
μ΄λ²μλ __iter__
μ __next__
λ©μλλ₯Ό μ§μ μ¬μ©νλ€.
aIterator = aList.__iter__()
aIterator.__next__()
aIterator.__next__()
aIterator.__next__()
aIterator.__next__()
μ€μ λ‘ μ΄ν°λ¬λΈ μλ£νμ for
λ°λ³΅λ¬Έκ³Ό ν¨κ» μ¬μ©νλ©΄
λ΄λΆμ μΌλ‘λ μμ μ€λͺ
ν λλ‘ μ΄ν°λ μ΄ν°λ‘ λ³νν ν
next
ν¨μλ₯Ό λ°λ³΅μ μΌλ‘ μ¬μ©νλ€.
μλ₯Ό λ€μ΄, μλ for
λ°λ³΅λ¬Έμ μ΄ν΄λ³΄μ.
for item in [1, 2, 3]:
print(item)
μ λ°λ³΅λ¬Έμ νμ΄μ¬ ν΄μκΈ°κ° μ²λ¦¬νλ μ€μ λ΄μ©μ λ€μκ³Ό κ°λ€.
aIterator = iter([1, 2, 3])
# 무ν λ°λ³΅λ¬Έ
while True:
try:
# λ€μ νλͺ© ꡬνκΈ°
item = next(aIterator)
print(item)
except StopIteration:
# λ μ΄μ νμΈν νλͺ©μ΄ μμΌλ©΄ λ°λ³΅λ¬Έ μ’
λ£
break
μ΄ν°λ¬λΈ μλ£νκ³Ό μ΄ν°λ μ΄ν° μλ£νμ λν΄μλ μ°μ μ΄ μ λ μμλλ©΄ μ’λ€. λ³΄λ€ λ§μ νμ© μμ μ λν μ€λͺ μ programiz.com: Python Iteratorsμ μ°Έκ³ ν κ²μ μΆμ²νλ€.
__len__
메서드¶λ¦¬μ€νΈ, νν, λ¬Έμμ΄, range
λ±μ μλ£νμ²λΌ νλͺ©λ€μ μμμ μ€λ³΅μ΄ νμ©λλ
μλ£νμ μμ°¨ λλ μνμ€(sequence) μλ£νμ΄λΌ νλ€.
λ°λ©΄μ μ§ν©, μ¬μ λ±μ μλ£νμ²λΌ μμλ₯Ό 무μνκ³ μ€λ³΅μ΄ νμ©λμ§ μλ μλ£νμ
λ¨μν λͺ¨μ(collection) μλ£νμ΄λΌ λΆλ₯Έλ€.
κ²½μ°μ λ°λΌ μμ°¨ μλ£νλ λ¨μν λͺ¨μ μλ£νμΌλ‘ κ°μ£ΌνκΈ°λ νλ€.
μμ°¨μ λͺ¨μ μλ£νμ λͺ¨λ νλͺ©μ κ°μλ₯Ό νμΈν΄μ£Όλ __len__
λ©μλλ₯Ό κ°κ³ μλ€.
μ£Όμ: __len__
λ©μλλ object
μ ν¬ν¨λμ΄ μμ§ μλ€.
[1, 2, 3].__len__()
"Python".__len__()
jane
μ __dict__
μμ±μλ λ κ°μ νλͺ©μ΄ ν¬ν¨λμ΄ μλ€.
jane.__dict__.__len__()
μ΄μ κ°μ΄ __len__
λ©μλλ₯Ό ν¬ν¨ν μλ£νμ λν΄μ
len
ν¨μλ₯Ό μ¬μ©νμ¬ νλͺ©μ κ°μλ₯Ό νμΈν μ μλ€.
μ¦, len
ν¨μλ₯Ό μλμ κ°μ΄ μ μλ κ²μΌλ‘ μκ°ν μ μλ€.
def len(s):
return s.__len__()
len([1, 2, 3])
len("Python")
len(jane.__dict__)
Person
ν΄λμ€μμ __init__
λ©μλλ₯Ό μλ‘ μ μνμλ€.
μ΄μ κ°μ΄ λ©μλλ₯Ό μλ‘ μ μνλ κ²μ
λ©μλ μ¬μ μ λλ λ©μλ μ€λ²λΌμ΄λ©(method overriding)μ΄λΌ λΆλ₯Έλ€.
λ°λΌμ λͺ¨λ λ§€μ§ λ©μλλ μ¬μ μ λλ κ°, μλλ©΄ λΆλͺ¨ ν΄λμ€μμ μ μΈλ κ·Έλλ‘ μ¬μ©λλ€.
μ¬κΈ°μλ μμ λ€λ£¨μ§ μμμ§λ§ μ€μν λ§€μ§ λ©μλ λͺ κ°λ₯Ό μ¬μ μνλ κ²μ ν΅ν΄ μ μ©ν μλ£νμ μ μνλ λ°©λ²μ μκ°νλ€.
Fraction
클래스¶λΆλμμμ μ λ€λ£¨λ float
μλ£νμ μνλ κ°λ€μ μ€μλ₯Ό λ€λ£¨κΈ° μν΄ κ΅¬νλμλ€.
νμ§λ§ μ»΄ν¨ν°μ νκ³λ‘ μΈν΄ μ€μ λ‘ λ€λ£° μ μλ κ°λ€μ μμμ μ΄ν μλ¦Ώμκ° μ νλλ€.
μ¦, μ»΄ν¨ν°λ κΈ°λ³Έμ μΌλ‘ μ νλ λ²μμ μ 리μλ§ λ€λ£° μ μλ€.
μ΄λ° μ΄μ λ‘ ν΄μ μ 리μ μ°μ°μ 100% μ ννκ² κ³μ°νκΈ° μ΄λ €μ΄
κ²½μ°κ° λ°μνλ©°, μ΄λ° λ¬Έμ λ₯Ό μ λ¬Έμ μΌλ‘ λ§€μ° μ‘°μ¬μ€λ½κ² λ€λ£¨μ΄μΌ νλ©°,
λ§μ 곡ν λΆμΌμμ κ²½μ°μ λ°λΌ λ§€μ° ν΄κ²°νκΈ° μ΄λ €μ΄ λ¬Έμ λ₯Ό λ°μμν€κΈ°λ νλ€.
μλ₯Ό λ€μ΄, μλ μ½λλ 10μ 1000μΉ λΆμ 1μ΄ 0κ³Ό κ°λ€κ³ νλ¨νλ€. 10μ 1000μΉ λΆμ 1μ΄ λ§€μ° μμ μμ΄κΈ΄ νμ§λ§ 0μ μλλ° μ»΄ν¨ν°λ κ·Έλ λ€κ³ νλ¨νλ€.
$$x = \text{1.0e-1000} = 1.0 \times 10^{-1000} = \frac{1}{10^{1000}}$$μ£Όμ: μ΄λ° λ¬Έμ λ νμ΄μ¬μ λ¬Έμ κ° μλλΌ, μ»΄ν¨ν°μ κΈ°λ³Έ νκ³ λλ¬Έμ λ°μνλ λ¬Έμ μ΄λ€. λ€λ₯Έ νλ‘κ·Έλλ° μΈμ΄λ₯Ό μ¬μ©ν΄λ λΉμ·ν λ¬Έμ κ° λ°μνλ€.
x = 1.0e-1000
x == 0
μ΄μ κ°μ λ¬Έμ λ₯Ό μ΄λ μ λ ν΄κ²°νκΈ° μν΄ νμ΄μ¬μ μ 리μλ€μ ν΄λμ€μΈ
Fraction
μ μ 곡νλ€.
Fraction
μλ£νμ μν κ°μ μ μλ€μ λΆμμ ν΄λΉνλ©°,
λͺ¨λ μ°μ°μ λΆμλ€μ μ°μ°μΌλ‘ μ²λ¦¬λλ€.
Fraction
ν΄λμ€λ fractions
λͺ¨λμ μ μΈλμ΄ μλ€.
from fractions import Fraction
μλ₯Ό λ€μ΄ $\frac{1}{2}$, $\frac{1}{3}$, $\frac{2}{4}$μ ν΄λΉνλ μλ κ°κ° μλμ κ°μ΄ νννλ€.
F12= Fraction(1, 2)
F13= Fraction(1, 3)
F24= Fraction(2, 4)
μ¬μΉμ°μ°μ΄ κ°λ₯νλ€.
κ²°κ³Όλ __repr__
λ©μλμ κΈ°λ₯μ ν΅ν΄ λ€μ Fraction ν΄λμ€μ κ°μ²΄λ‘ 보μ¬μ§λ€.
# 1/2 + 1/3 = 5/6
F12 + F13
# 1/3 - 1/2 = -1/6
F13 - F12
# 1/2 * 1/3 = 1/6
F12 * F13
# (1/3) / (1/2) = 2/3
F13 / F12
λΆμκ° κΈ°λ³Έμ μΌλ‘ μ½λΆλμ΄ μ²λ¦¬λλ€. μλ₯Ό λ€μ΄, 1/2 + 1/2λ₯Ό 2/2κ° μλ 1/1, μ¦ 1λ‘ μ²λ¦¬νλ€.
F12 + F12
Fraction κ°μ²΄μ μ μλ€κ³Όμ μ°μ°λ κ°λ₯νλ€.
Fraction(1, 6) + 2
Fraction(1, 6) * 2
print
ν¨μλ₯Ό μ¬μ©νλ©΄ μ΅μν ννμΌλ‘ 보μ¬μ§λ€.
μ¦, __str__
λ©μλκ° μ μ νκ² μ μλμ΄ μλ€.
print(F12)
print(F13)
print(F13 / F12)
ν¬κΈ° λΉκ΅λ κ°λ₯νλ€.
F12 < F13
λͺ¨λ μ°μ°μ μ½λΆμ μ μ λ‘ μ΄λ£¨μ΄μ§λ€. λ°λΌμ λ λΆμμ λμΌμ±λ μ½κ² νλ¨νλ€.
F12 == F24
Fraction
ν΄λμ€μ μ μ¬νκ² μλνλ ν΄λμ€λ₯Ό μ§μ μ μνλ©΄μ
λ€μ λ§€μ§ λ©μλλ€μ μ¬μ μνλ μ€μ΅μ ν΄λ³΄μ.
μ¬μ μ λμ λ©μλλ λ€μκ³Ό κ°λ€.
__repr__
__str__
__eq__
__lt__
__le__
__add__
import math
class myFraction:
"""λΆμ ν΄λμ€
μ μλ€μ λΆμλ₯Ό μ μλ€μ μμΌλ‘ ꡬνν¨.
λΆμλ κΈ°λ³Έμ μΌλ‘ μ½λΆ μ²λ¦¬νμ¬ μ μ₯.
"""
def __init__(self, numerator, denominator):
# λΆλͺ¨κ° 0μ΄λ©΄ μ€λ₯ λ°μ
if denominator == 0:
raise ZeroDivisionError(f"myFraction({numerator}, 0)")
# λΆλͺ¨λ νμ μμ μ μλ‘ μ μ§
elif denominator < 0:
denominator = -denominator
numerator = -numerator
# μ΅λ곡μ½μλ‘ λΆλͺ¨ λΆμ λλκΈ°
g = math.gcd(numerator, denominator)
numerator //= g
denominator //= g
# μΈμ€ν΄μ€ μμ±: λΆμμ λΆλͺ¨
# μ½λΆ ν μ μ₯
self._numerator = numerator
self._denominator = denominator
def __repr__(self):
return f"{self.__class__.__name__}({self._numerator},{self._denominator})"
def __str__(self):
if self._denominator == 1:
return str(self._numerator)
else:
return f"{self._numerator}/{self._denominator}"
# κ°λ€(equal)
def __eq__(self, other):
return (self._numerator * other._denominator) \
== (other._numerator * self._denominator)
# μλ€(less than)
def __lt__(self, other):
return (self._numerator * other._denominator) \
< (other._numerator * self._denominator)
# μκ±°λ κ°λ€(less than or equal)
def __le__(self, other):
return self < other or self == other
# λνκΈ°. myFraction κ°μ²΄λ₯Ό μμ±νλ©΄μ μμ°μ€λ½κ² κΈ°μ½λΆμλ‘ λ§λ¦.
def __add__(self, other):
numerator = self._numerator * other._denominator + \
self._denominator * other._numerator
denominator = self._denominator * other._denominator
return myFraction(numerator, denominator)
μ°Έκ³ : λΆμλ€μ ν¬κΈ° λΉκ΅μ λ§μ μ μλμ κ°μ΄ μ΄λ£¨μ΄μ§λ€.
R14 = myFraction(1, 4)
R14
print(R14)
Rm14 = myFraction(1, -4)
Rm14
print(Rm14)
R34 = myFraction(3, 4)
Rm34 = myFraction(-3, 4)
R28 = myFraction(2, 8)
print(R14)
print(R28)
R14 == R28
R14 < R34
R14 <= R34
Rm34 < Rm14
Rm34 <= Rm14
Rm34 >= Rm14
print(R14 + R34)
print(Rm14 + R34)
μ μμ λ€μ PythonTutor: μ λ¦¬μ€ ν΄λμ€μμ μ€ννλ©΄μ νμΈν μ μλ€.
myFraction
ν΄λμ€μ κ°μ²΄κ° μ¬μΉμ°μ°μ λͺ¨λ μ§μνλλ‘ μλ λ©μλλ₯Ό ꡬννλΌ.
κ·Έλ¬λ©΄ -
(λΆνΈ λ°κΎΈκΈ°), -
(λΊμ
), *
, /
λ±μ μ°μ° κΈ°νΈλ₯Ό μ¬μ©ν μ μλ€.__neg__
: λΆνΈ λ°κΎΈκΈ° (μμ <=> μμ)__sub__
: λΊμ
__mul__
: κ³±μ
__truediv__
: λλμ
myFraction
ν΄λμ€μ κ°μ²΄κ° μ μμμ μ¬μΉμ°μ°λ κ°λ₯νλλ‘ μλ λ©μλλ₯Ό μμ νλΌ.__add__
: λ§μ
__sub__
: λΊμ
__mul__
: κ³±μ
__truediv__
: λλμ