μ½λ - ν¨μΊ μμ μ½λ μ°Έκ³ (ν¨μΊ μμ μ 리)
<μ΄μ κΈ>
https://silvercoding.tistory.com/20
[python μ¬ν] 3. ν΄λμ€ λ©μλ, μΈμ€ν΄μ€ λ©μλ, μ€ν μ΄ν± λ©μλ
μ½λ - ν¨μΊ μμ μ½λ μ°Έκ³ (ν¨μΊ μμ μ 리) <μ΄μ κΈ> https://silvercoding.tistory.com/19 https://silvercoding.tistory.com/18 [python μ¬ν] 1. κ°μ²΄μ§ν₯(OOP), ν΄λμ€ κΈ°μ΄ μ¬μ© μ½λ - ν¨μΊ μμ μ½λ..
silvercoding.tistory.com
<λ°μ΄ν° λͺ¨λΈ μ°Έκ³ λ¬Έμ>
https://docs.python.org/3/reference/datamodel.html
3. Data model — Python 3.9.6 documentation
A class can implement certain operations that are invoked by special syntax (such as arithmetic operations or subscripting and slicing) by defining methods with special names. This is Python’s approach to operator overloading, allowing classes to define
docs.python.org
[ κ°μ²΄ (Objects)λ νμ΄μ¬μ΄ λ°μ΄ν°(data)λ₯Ό μΆμνν κ²(abstraction)μ λλ€. νμ΄μ¬ νλ‘κ·Έλ¨μ λͺ¨λ λ°μ΄ν°λ κ°μ²΄λ κ°μ²΄ κ°μ κ΄κ³λ‘ ννλ©λλ€.
λͺ¨λ κ°μ²΄λ μμ΄λ΄ν°ν°(identity), ν(type), κ°(value)μ κ°μ΅λλ€. κ°μ²΄μ μμ΄λ΄ν°ν° λ ν λ² λ§λ€μ΄μ§ νμλ λ³κ²½λμ§ μμ΅λλ€. λ©λͺ¨λ¦¬μμμμ κ°μ²΄μ μ£Όμλ‘ μκ°ν΄λ μ’μ΅λλ€. γisγ μ°μ°μλ λ κ°μ²΄μ μμ΄λ΄ν°ν°λ₯Ό λΉκ΅ν©λλ€. id() ν¨μλ μμ΄λ΄ν°ν°λ₯Ό μ μλ‘ ννν κ°μ λλ €μ€λλ€. ]
μμ λ¬Έμμμ λμμλ κ°μ²΄μ μ€λͺ μ΄λ€. λͺ¨λ κ°μ²΄λ id, type, valueλ₯Ό κ°λλ€. μλ₯Ό λ€μ΄
a = 7
print(id(a), type(a), dir(a))
μ΄λ¬ν aλΌλ λ³μλ κ°μ²΄λΌλ κ²μ΄λ€. λ°λΌμ id, type, valueλ₯Ό λͺ¨λ κ°κ³ μλ€λ κ²μ μ μ μλ€.
- λ€μνΈ νν
<λ μ μ¬μ΄μ 거리λ₯Ό ꡬνλ μμ >
(1) μΌλ°μ μΈ νν μ¬μ©
pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)
from math import sqrt
from typing import ClassVar
line_leng1 = sqrt((pt2[0] - pt1[0]) ** 2 + (pt2[1] - pt1[1]) ** 2)
print('EX1-1 : ', line_leng1)
μ΄λ κ² μΈλ±μ€λ₯Ό μ΄μ―νμ¬ κ΅¬νκ² λλ€. μ΄λ κ² κ°λ¨ν μμ μμλ μκ΄μ΄ μκΈ΄ νμ§λ§ κ°λ μ±μ΄ λ¨μ΄μ§λ κ² κ°κΈ΄ νλ€. μ‘°κΈ λ 볡μ‘ν μμμ΄λΌλ©΄ μ€μνκΈ° λ±μ’λ€! xκ° λΌλ¦¬ λΉΌμ£Όκ³ , yκ° λΌλ¦¬ λΉΌμ£Όλ κ²μ λ λͺ μμ μΌλ‘ μ μ΄μ€ μ μλ named tupleμ μ¬μ©ν΄ 보μ!
(2) λ€μλ νν μ¬μ©
*** named tuple μ μΈλ²
from collections import namedtuple
Point1 = namedtuple('Point', ['x', 'y'])
Point2 = namedtuple('Point', 'x, y')
Point3 = namedtuple('Point', 'x y')
Point4 = namedtuple('Point', 'x y x class', rename=True) # Defalult=False
# μΆλ ₯
print('EX2-1 - ', Point1, Point2, Point3, Point4)
# Dict to Unpacking
temp_dict = {'x' : 75, 'y' : 55}
# κ°μ²΄ μμ±
print()
p1 = Point1(x=10, y=35)
p2 = Point2(20, 40)
p3 = Point3(45, y=20)
p4 = Point4(10, 20, 30, 40)
p5 = Point3(**temp_dict)
print('EX2-2 - ', p1, p2, p3, p4, p5)
collectionsμ namedtupleμ importν΄μ€λ€. λ€μλ ννμ ν΄λμ€λ‘ νκΈ°μ λ무 ν€λΉνκ³ , ννμ μ΄λ¦μ μ£Όκ³ μΆμ λ μ¬μ©νλ€.
point4μμλ xκ° μ€λ³΅μΌλ‘ λ€μ΄ κ° μκ³ , classλ λ³μλͺ μΌλ‘ μ¬μ©ν μ μμΌλ―λ‘ rename=Trueλ₯Ό μ€μ ν΄ λμ§ μλλ€λ©΄ μ€λ₯κ° λ κ²μ΄λ€.
rename=Trueλ₯Ό μ€μ ν΄ λμΌλ©΄ μμκ°μ΄ μμμ λ³μλͺ μ΄ λ°λκ² λλ€.
*** μ¬μ©
print('EX3-1 - ', p1[0] + p2[1]) # Index Error μ£Όμ
print('EX3-2 - ', p1.x + p2.y) # ν΄λμ€ λ³μ μ κ·Ό λ°©μ
# Unpacking
x, y = p3
print('EX3-3 - ', x + y)
κΈ°μ‘΄ tupleκ³Ό κ°μ΄ Unpackingλ κ°λ₯νλ€.
*** λ€μλννμ λ©μλ
- _make() : μλ‘μ΄ κ°μ²΄λ₯Ό μμ± (리μ€νΈ ---> λ€μλνν)
p4 = Point1._make(temp)
print('EX4-1 - ', p4)
- _field : νλ λ€μ νμΈ
print('EX4-2 - ', p1._fields, p2._fields, p3._fields)
- _asdict() : OrderDict λ°ν
# _asdict() : OrderDict λ°ν
print('EX4-3 - ', p1._asdict(), p1._asdict(), p3._asdict(), p4._asdict())
- _replace() : μμ λ 'μλ‘μ΄' κ°μ²΄ λ°ν
print('EX4-4 - ', p2._replace(y=100))
μ΄λ κ² νλμ λν κ°μ λ³κ²½ν΄μ€ μ μλλ°, μ΄λ 리μ€νΈ μ²λΌ κ°μ΄ λ³κ²½λλ κ²μ΄ μλλΌ , μμ μλ‘μ΄ κ°μ²΄λ₯Ό λ°νν΄ μ£Όλ κ²μ΄λ€.
*** μμ
# λ€μλ νν μ μΈ
Point = namedtuple('Point', 'x y')
# λ μ μ μΈ
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)
# λ μ μ¬μ΄μ 거리 κ³μ°
line_leng2 = sqrt((pt2.x - pt1.x) ** 2 + (pt2.y - pt1.y) ** 2)
# μΆλ ₯
print("EX1-2 - ", line_leng2)
print("EX1-3 - ", line_leng1 == line_leng2)
κ·Έλμ μλ νλ €νλ μμ λ₯Ό λ€μλ ννμ μ¬μ©νλ©΄ μμ κ°λ€. λ€μλννμ μ¬μ©νλ©΄ μμκ°μ΄ λ λͺ μμ μΌλ‘ μμμ μμ±ν΄μ€ μ μλ€.
- λ€μλ νν μ€μ΅
νμ κ·Έλ£Ήμ μμ±νλ μμ , 4κ°μ λ°(A, B, C, D) μμ κ°κ° 20λͺ μ νμμ΄ μ‘΄μ¬
(1) λ€μλ νν μ μΈ
Classes = namedtuple('Classed', ['rank', 'number'])
(2) κ·Έλ£Ή 리μ€νΈ μ μΈ (List Comprehension μ¬μ©)
# List Comprehension
numbers = [str(n) for n in range(1, 21)]
ranks = 'A B C D'.split()
print(ranks, numbers)
print()
# List Comprehension
students = [Classes(rank, number) for rank in ranks for number in numbers]
print('EX5-1 - ', len(students))
print('EX5-2 - ', students[4].rank)
numberλ 1~20μ λ¬Έμλ₯Ό λ΄κ³ μλ 리μ€νΈ, ranksλ A~Bμ λ¬Έμλ₯Ό λ΄κ³ μλ 리μ€νΈμ΄λ€.
μ΄μ λ€μλ ννμ κ°μ²΄λ€μ list comprehensionμ μ¬μ©νμ¬ μμ±ν΄ μ€λ€. μ΄ 20 * 4 = 80 κ°μ κ°μ²΄κ° 리μ€νΈ μμ μμ±λ κ²μ΄λ€.
*** κ°λ μ±μ΄ λ¨μ΄μ§μ§λ§ νλ²μ 그룹리μ€νΈλ₯Ό λ§λλλ²
students2 = [Classes(rank, number) for rank in 'A B C D'.split() for number in [str(n) for n in range(1, 21)]]
print('EX6-1 - ', len(students2))
print('EX6-1 - ', students2)
리μ€νΈμ νλ²μ λλ €λ°μ μ£Όλ λ²μ΄λ€. λλ μ§ κ³Όνλ©΄ λ μ΄ λλ κ² κ°λ€. κ°λ μ±μ΄ λ¨μ΄μ§μ§λ§ μ΄λ° λ°©λ²λ μλ€λ κ²μ μμλκΈ°.