Pythonμ λμ€ν¬λ¦½ν° νλ‘ν μ½ μ±λ₯ νΉμ±μ νꡬνκ³ , κ°μ²΄ μμ± μ κ·Ό μλμ λ©λͺ¨λ¦¬ μ¬μ©λμ λ―ΈμΉλ μν₯μ μ΄ν΄ν©λλ€. μ½λ ν¨μ¨μ±μ λμ΄λ μ΅μ ν λ°©λ²μ λ°°μλλ€.
κ°μ²΄ μμ± μ κ·Ό: λμ€ν¬λ¦½ν° νλ‘ν μ½ μ±λ₯ μ¬μΈ΅ λΆμ
Python νλ‘κ·Έλλ° μΈκ³μμ κ°μ²΄ μμ±μ΄ μ΄λ»κ² μ κ·Όλκ³ κ΄λ¦¬λλμ§ μ΄ν΄νλ κ²μ ν¨μ¨μ μ΄κ³ μ±λ₯μ΄ λ°μ΄λ μ½λλ₯Ό μμ±νλ λ° μ€μν©λλ€. Pythonμ λμ€ν¬λ¦½ν° νλ‘ν μ½μ μμ± μ κ·Όμ μ¬μ©μ μ μν μ μλ κ°λ ₯ν λ©μ»€λμ¦μ μ 곡νμ¬ κ°λ°μκ° μμ±μ μ½κ³ , μ°κ³ , μμ νλ λ°©λ²μ μ μ΄ν μ μλλ‘ ν©λλ€. κ·Έλ¬λ λμ€ν¬λ¦½ν°μ μ¬μ©μ λλλ‘ κ°λ°μκ° μΈμ§ν΄μΌ ν μ±λ₯ κ³ λ € μ¬νμ μΌκΈ°ν μ μμ΅λλ€. μ΄ λΈλ‘κ·Έ κ²μλ¬Όμ λμ€ν¬λ¦½ν° νλ‘ν μ½μ μ¬μΈ΅μ μΌλ‘ νꡬνκ³ , μμ± μ κ·Ό μλ λ° λ©λͺ¨λ¦¬ μ¬μ©λμ λ―ΈμΉλ μν₯μ λΆμνλ©°, μ΅μ νλ₯Ό μν μ€ν κ°λ₯ν ν΅μ°°λ ₯μ μ 곡ν©λλ€.
λμ€ν¬λ¦½ν° νλ‘ν μ½ μ΄ν΄
λ³Έμ§μ μΌλ‘ λμ€ν¬λ¦½ν° νλ‘ν μ½μ κ°μ²΄μ μμ±μ΄ μ΄λ»κ² μ κ·Όλλμ§ μ μνλ λ©μλ μ§ν©μ λλ€. μ΄λ¬ν λ©μλλ λμ€ν¬λ¦½ν° ν΄λμ€μ ꡬνλλ©°, μμ±μ΄ μ κ·Όλ λ Pythonμ κ°μ²΄μ ν΄λμ€ λλ ν΄λΉ μμ ν΄λμ€μμ ν΄λΉ μμ±κ³Ό κ΄λ ¨λ λμ€ν¬λ¦½ν° κ°μ²΄λ₯Ό μ°Ύμ΅λλ€. λμ€ν¬λ¦½ν° νλ‘ν μ½μ λ€μ μΈ κ°μ§ μ£Όμ λ©μλλ‘ κ΅¬μ±λ©λλ€:
__get__(self, instance, owner): μ΄ λ©μλλ μμ±μ΄ μ κ·Όλ λ (μ:object.attribute) νΈμΆλ©λλ€. μμ± κ°μ λ°νν΄μΌ ν©λλ€.instanceμΈμλ μμ±μ΄ μΈμ€ν΄μ€λ₯Ό ν΅ν΄ μ κ·Όλλ κ²½μ° κ°μ²΄ μΈμ€ν΄μ€μ΄λ©°, ν΄λμ€λ₯Ό ν΅ν΄ μ κ·Όλλ κ²½μ°Noneμ λλ€.ownerμΈμλ λμ€ν¬λ¦½ν°λ₯Ό μμ νλ ν΄λμ€μ λλ€.__set__(self, instance, value): μ΄ λ©μλλ μμ±μ κ°μ΄ ν λΉλ λ (μ:object.attribute = value) νΈμΆλ©λλ€. μμ± κ°μ μ€μ νλ μν μ ν©λλ€.__delete__(self, instance): μ΄ λ©μλλ μμ±μ΄ μμ λ λ (μ:del object.attribute) νΈμΆλ©λλ€. μμ±μ μμ νλ μν μ ν©λλ€.
λμ€ν¬λ¦½ν°λ ν΄λμ€λ‘ ꡬνλ©λλ€. μΌλ°μ μΌλ‘ νλ‘νΌν°, λ©μλ, μ μ λ©μλ λ° ν΄λμ€ λ©μλλ₯Ό ꡬννλ λ° μ¬μ©λ©λλ€.
λμ€ν¬λ¦½ν° μ ν
λμ€ν¬λ¦½ν°μλ λ κ°μ§ μ£Όμ μ νμ΄ μμ΅λλ€:
- λ°μ΄ν° λμ€ν¬λ¦½ν°: μ΄ λμ€ν¬λ¦½ν°λ
__get__()κ³Ό__set__()λλ__delete__()λ©μλ μ€ νλλ₯Ό λͺ¨λ ꡬνν©λλ€. λ°μ΄ν° λμ€ν¬λ¦½ν°λ μΈμ€ν΄μ€ μμ±λ³΄λ€ μ°μ ν©λλ€. μμ±μ μ κ·Όνκ³ λ°μ΄ν° λμ€ν¬λ¦½ν°κ° λ°κ²¬λλ©΄ ν΄λΉ__get__()λ©μλκ° νΈμΆλ©λλ€. μμ±μ κ°μ΄ ν λΉλκ±°λ μμ λλ©΄ λ°μ΄ν° λμ€ν¬λ¦½ν°μ μ μ ν λ©μλ (__set__()λλ__delete__())κ° νΈμΆλ©λλ€. - λ
Όλ°μ΄ν° λμ€ν¬λ¦½ν°: μ΄ λμ€ν¬λ¦½ν°λ
__get__()λ©μλλ§ κ΅¬νν©λλ€. λ Όλ°μ΄ν° λμ€ν¬λ¦½ν°λ μΈμ€ν΄μ€μ λμ λ리μμ μμ±μ΄ λ°κ²¬λμ§ μκ³ ν΄λμ€μμ λ°μ΄ν° λμ€ν¬λ¦½ν°λ λ°κ²¬λμ§ μμ κ²½μ°μλ§ νμΈλ©λλ€. μ΄λ₯Ό ν΅ν΄ μΈμ€ν΄μ€ μμ±μ΄ λ Όλ°μ΄ν° λμ€ν¬λ¦½ν°μ λμμ μ¬μ μν μ μμ΅λλ€.
λμ€ν¬λ¦½ν°μ μ±λ₯ μν₯
λμ€ν¬λ¦½ν° νλ‘ν μ½μ μ¬μ©νλ©΄ μμ±μ μ§μ μ κ·Όνλ κ²μ λΉν΄ μ±λ₯ μ€λ²ν€λκ° λ°μν μ μμ΅λλ€. μ΄λ λμ€ν¬λ¦½ν°λ₯Ό ν΅ν μμ± μ κ·Όμ΄ μΆκ°μ μΈ ν¨μ νΈμΆκ³Ό μ‘°νλ₯Ό ν¬ν¨νκΈ° λλ¬Έμ λλ€. μ±λ₯ νΉμ±μ μμΈν μ΄ν΄λ³΄κ² μ΅λλ€:
μ‘°ν μ€λ²ν€λ
μμ±μ μ κ·Όν λ Pythonμ λ¨Όμ κ°μ²΄μ __dict__ (κ°μ²΄μ μΈμ€ν΄μ€ λμ
λ리)μμ μμ±μ κ²μν©λλ€. μμ±μ΄ κ±°κΈ°μ λ°κ²¬λμ§ μμΌλ©΄ Pythonμ ν΄λμ€μμ λ°μ΄ν° λμ€ν¬λ¦½ν°λ₯Ό μ°Ύμ΅λλ€. λ°μ΄ν° λμ€ν¬λ¦½ν°κ° λ°κ²¬λλ©΄ ν΄λΉ __get__() λ©μλκ° νΈμΆλ©λλ€. λ°μ΄ν° λμ€ν¬λ¦½ν°κ° λ°κ²¬λμ§ μμ κ²½μ°μλ§ Pythonμ λ
Όλ°μ΄ν° λμ€ν¬λ¦½ν°λ₯Ό κ²μνκ±°λ, μ무κ²λ λ°κ²¬λμ§ μμΌλ©΄ λ©μλ ν΄κ²° μμ(MRO)λ₯Ό ν΅ν΄ μμ ν΄λμ€μμ μ°Ύμ΅λλ€. λμ€ν¬λ¦½ν° μ‘°ν νλ‘μΈμ€λ μμ± κ°μ΄ κ²μλκΈ° μ μ μ¬λ¬ λ¨κ³μ ν¨μ νΈμΆμ ν¬ν¨ν μ μμΌλ―λ‘ μ€λ²ν€λλ₯Ό μΆκ°ν©λλ€. μ΄λ λ°λ³΅λ¬Έμ΄ λ°μ νκ² μ¬μ©λκ±°λ μμ±μ μμ£Ό μ κ·Όν λ νΉν λλλ¬μ§ μ μμ΅λλ€.
ν¨μ νΈμΆ μ€λ²ν€λ
λμ€ν¬λ¦½ν° λ©μλ (__get__(), __set__() λλ __delete__())μ λν κ° νΈμΆμ μκ°μ΄ 걸리λ ν¨μ νΈμΆμ μλ°ν©λλ€. μ΄ μ€λ²ν€λλ μλμ μΌλ‘ μμ§λ§, μλ§μ μμ± μ κ·ΌμΌλ‘ μΈν΄ λμ λμ΄ μ 체 μ±λ₯μ μν₯μ λ―ΈμΉ μ μμ΅λλ€. νΉν λ§μ λ΄λΆ μμ
μ ν¬ν¨νλ ν¨μλ μ§μ μμ± μ κ·Όλ³΄λ€ λ릴 μ μμ΅λλ€.
λ©λͺ¨λ¦¬ μ¬μ©λ κ³ λ € μ¬ν
λμ€ν¬λ¦½ν° μ체λ μΌλ°μ μΌλ‘ λ©λͺ¨λ¦¬ μ¬μ©λμ ν¬κ² κΈ°μ¬νμ§ μμ΅λλ€. κ·Έλ¬λ λμ€ν¬λ¦½ν°κ° μ¬μ©λλ λ°©μκ³Ό μ½λμ μ 체μ μΈ μ€κ³λ λ©λͺ¨λ¦¬ μλΉμ μν₯μ λ―ΈμΉ μ μμ΅λλ€. μλ₯Ό λ€μ΄, νλ‘νΌν°κ° νμμ λ°λΌ κ°μ κ³μ°νκ³ λ°ννλ λ° μ¬μ©λλ κ²½μ°, κ³μ°λ κ°μ΄ μꡬμ μΌλ‘ μ μ₯λμ§ μμΌλ©΄ λ©λͺ¨λ¦¬λ₯Ό μ μ½ν μ μμ΅λλ€. νμ§λ§ νλ‘νΌν°κ° λ§μ μμ μΊμλ λ°μ΄ν°λ₯Ό κ΄λ¦¬νλ λ° μ¬μ©λλ κ²½μ°, μκ°μ΄ μ§λ¨μ λ°λΌ μΊμκ° μ¦κ°νλ©΄ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ λμ΄λ μ μμ΅λλ€.
λμ€ν¬λ¦½ν° μ±λ₯ μΈ‘μ
λμ€ν¬λ¦½ν°μ μ±λ₯ μν₯μ μ λννκΈ° μν΄, μμ μ½λ μ‘°κ°μ μ€ν μκ°μ μΈ‘μ νλλ‘ μ€κ³λ Pythonμ timeit λͺ¨λμ μ¬μ©ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, μμ±μ μ§μ μ κ·Όνλ κ²κ³Ό νλ‘νΌν° (λ°μ΄ν° λμ€ν¬λ¦½ν°μ ν μ ν)λ₯Ό ν΅ν΄ μμ±μ μ κ·Όνλ μ±λ₯μ λΉκ΅ν΄ λ³΄κ² μ΅λλ€:
import timeit
class DirectAttributeAccess:
def __init__(self, value):
self.value = value
class PropertyAttributeAccess:
def __init__(self, value):
self._value = value
@property
def value(self):
return self._value
@value.setter
def value(self, new_value):
self._value = new_value
# Create instances
direct_obj = DirectAttributeAccess(10)
property_obj = PropertyAttributeAccess(10)
# Measure direct attribute access
def direct_access():
for _ in range(1000000):
direct_obj.value
direct_time = timeit.timeit(direct_access, number=1)
print(f'Direct attribute access time: {direct_time:.4f} seconds')
# Measure property attribute access
def property_access():
for _ in range(1000000):
property_obj.value
property_time = timeit.timeit(property_access, number=1)
print(f'Property attribute access time: {property_time:.4f} seconds')
#Compare the execution times to assess the performance difference.
μ΄ μμμμλ μΌλ°μ μΌλ‘ μμ±μ μ§μ μ κ·Όνλ κ² (direct_obj.value)μ΄ νλ‘νΌν°λ₯Ό ν΅ν΄ μ κ·Όνλ κ² (property_obj.value)λ³΄λ€ μ½κ° λ λΉ λ₯΄λ€λ κ²μ μ μ μμ΅λλ€. κ·Έλ¬λ νλ‘νΌν°κ° μλμ μΌλ‘ μμ κ³μ°μ΄λ μμ
μ μννλ κ²½μ° λ§μ μ ν리μΌμ΄μ
μμ κ·Έ μ°¨μ΄λ λ―Έλ―Έν μ μμ΅λλ€.
λμ€ν¬λ¦½ν° μ±λ₯ μ΅μ ν
λμ€ν¬λ¦½ν°λ μ±λ₯ μ€λ²ν€λλ₯Ό μ λ°ν μ μμ§λ§, κ·Έ μν₯μ μ΅μννκ³ μμ± μ κ·Όμ μ΅μ ννκΈ° μν λͺ κ°μ§ μ λ΅μ΄ μμ΅λλ€:
1. νμν λ κ° μΊμ
νλ‘νΌν°λ λμ€ν¬λ¦½ν°κ° κ°μ κ³μ°νκΈ° μν΄ κ³μ° λΉμ©μ΄ λ§μ΄ λλ μμ μ μννλ κ²½μ°, κ²°κ³Όλ₯Ό μΊμνλ κ²μ κ³ λ €νμΈμ. κ³μ°λ κ°μ μΈμ€ν΄μ€ λ³μμ μ μ₯νκ³ νμν λλ§ λ€μ κ³μ°νμΈμ. μ΄λ κ³μ°μ μνν΄μΌ νλ νμλ₯Ό ν¬κ² μ€μ¬ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€. μλ₯Ό λ€μ΄, μ«μμ μ κ³±κ·Όμ μ¬λ¬ λ² κ³μ°ν΄μΌ νλ μλ리μ€λ₯Ό κ³ λ €ν΄ λ³΄μΈμ. μ κ³±κ·Όμ ν λ²λ§ κ³μ°νλ©΄ λλ κ²½μ°, κ²°κ³Όλ₯Ό μΊμνλ©΄ μλΉν μλ ν₯μμ μ»μ μ μμ΅λλ€:
import math
class CachedSquareRoot:
def __init__(self, value):
self._value = value
self._cached_sqrt = None
@property
def value(self):
return self._value
@value.setter
def value(self, new_value):
self._value = new_value
self._cached_sqrt = None # Invalidate cache on value change
@property
def square_root(self):
if self._cached_sqrt is None:
self._cached_sqrt = math.sqrt(self._value)
return self._cached_sqrt
# Example usage
calculator = CachedSquareRoot(25)
print(calculator.square_root) # Calculates and caches
print(calculator.square_root) # Returns cached value
calculator.value = 36
print(calculator.square_root) # Calculates and caches again
2. λμ€ν¬λ¦½ν° λ©μλ 볡μ‘μ± μ΅μν
__get__(), __set__(), __delete__() λ©μλ λ΄μ μ½λλ₯Ό κ°λ₯ν ν κ°λ¨νκ² μ μ§νμΈμ. μ΄λ¬ν λ©μλλ μμ±μ μ κ·Ό, μ€μ λλ μμ λ λλ§λ€ μ€νλλ―λ‘, 볡μ‘ν κ³μ°μ΄λ μμ
μ νΌν΄μΌ ν©λλ€. 볡μ‘ν μμ
μ λ³λμ ν¨μλ‘ μμνκ³ , λμ€ν¬λ¦½ν° λ©μλ λ΄μμ ν΄λΉ ν¨μλ₯Ό νΈμΆνμΈμ. κ°λ₯ν λλ§λ€ λμ€ν¬λ¦½ν°μ 볡μ‘ν λ‘μ§μ λ¨μννλ κ²μ κ³ λ €νμΈμ. λμ€ν¬λ¦½ν° λ©μλκ° ν¨μ¨μ μΌμλ‘ μ 체 μ±λ₯μ΄ ν₯μλ©λλ€.
3. μ μ ν λμ€ν¬λ¦½ν° μ ν μ ν
νμμ λ§λ μ¬λ°λ₯Έ λμ€ν¬λ¦½ν° μ νμ μ ννμΈμ. μμ± κ°μ Έμ€κΈ° λ° μ€μ λͺ¨λλ₯Ό μ μ΄ν νμκ° μλ€λ©΄ λ
Όλ°μ΄ν° λμ€ν¬λ¦½ν°λ₯Ό μ¬μ©νμΈμ. λ
Όλ°μ΄ν° λμ€ν¬λ¦½ν°λ __get__() λ©μλλ§ κ΅¬ννκΈ° λλ¬Έμ λ°μ΄ν° λμ€ν¬λ¦½ν°λ³΄λ€ μ€λ²ν€λκ° μ μ΅λλ€. μμ± μ κ·Όμ μΊ‘μννκ³ μμ±μ΄ μ½κ³ , μ°κ³ , μμ λλ λ°©μμ λ λ§μ μ μ΄λ₯Ό μ 곡ν΄μΌ ν λ, λλ μ΄λ¬ν μμ
μ€μ μ ν¨μ± κ²μ¬λ κ³μ°μ μνν΄μΌ ν λ νλ‘νΌν°λ₯Ό μ¬μ©νμΈμ.
4. νλ‘νμΌλ§ λ° λ²€μΉλ§ν¬
Pythonμ cProfile λͺ¨λμ΄λ `py-spy`μ κ°μ νμ¬ νλ‘νμΌλ¬λ₯Ό μ¬μ©νμ¬ μ½λλ₯Ό νλ‘νμΌλ§νκ³ μ±λ₯ λ³λͺ© νμμ μλ³νμΈμ. μ΄λ¬ν λꡬλ λμ€ν¬λ¦½ν°κ° μλ μ νλ₯Ό μ λ°νλ μμμ μ νν μ°ΎμλΌ μ μμ΅λλ€. μ΄ μ 보λ μ΅μ νλ₯Ό μν κ°μ₯ μ€μν μμμ μλ³νλ λ° λμμ΄ λ κ²μ
λλ€. μ½λλ₯Ό λ²€μΉλ§νΉνμ¬ λ³κ²½ μ¬νμ΄ λ―ΈμΉλ μν₯μ μΈ‘μ νμΈμ. μ΄λ μ΅μ νκ° ν¨κ³Όμ μ΄κ³ νκ·λ₯Ό μ λ°νμ§ μμλμ§ νμΈν μ μλλ‘ ν©λλ€. timeitκ³Ό κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ©΄ μ±λ₯ λ¬Έμ λ₯Ό 격리νκ³ λ€μν μ κ·Ό λ°©μμ ν
μ€νΈνλ λ° λμμ΄ λ μ μμ΅λλ€.
5. 루ν λ° λ°μ΄ν° ꡬ쑰 μ΅μ ν
μ½λμμ 루ν λ΄μμ μμ±μ μμ£Ό μ κ·Όνλ κ²½μ°, 루ν ꡬ쑰μ κ°μ²΄λ₯Ό μ μ₯νλ λ° μ¬μ©λλ λ°μ΄ν° ꡬ쑰λ₯Ό μ΅μ ννμΈμ. 루ν λ΄μμ μμ± μ κ·Ό νμλ₯Ό μ€μ΄κ³ , 리μ€νΈ, λμ λ리 λλ μΈνΈμ κ°μ ν¨μ¨μ μΈ λ°μ΄ν° ꡬ쑰λ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό μ μ₯νκ³ μ κ·ΌνμΈμ. μ΄λ Python μ±λ₯ ν₯μμ μν μΌλ°μ μΈ μμΉμ΄λ©°, λμ€ν¬λ¦½ν° μ¬μ© μ¬λΆμ κ΄κ³μμ΄ μ μ©λ©λλ€.
6. κ°μ²΄ μΈμ€ν΄μ€ν κ°μ (ν΄λΉνλ κ²½μ°)
κ³Όλν κ°μ²΄ μμ± λ° νκ΄΄λ μ€λ²ν€λλ₯Ό μ λ°ν μ μμ΅λλ€. 루νμμ λμ€ν¬λ¦½ν°λ₯Ό κ°μ§ κ°μ²΄λ₯Ό λ°λ³΅μ μΌλ‘ μμ±νλ μλ리μ€κ° μλ€λ©΄, κ°μ²΄ μΈμ€ν΄μ€ν λΉλλ₯Ό μ€μΌ μ μλμ§ κ³ λ €ν΄ λ³΄μΈμ. κ°μ²΄μ μλͺ μ΄ μ§§λ€λ©΄, μκ°μ΄ μ§λ¨μ λ°λΌ μλΉν μ€λ²ν€λκ° λμ λ μ μμ΅λλ€. κ°μ²΄ νλ§ λλ κ°μ²΄ μ¬μ¬μ©μ μ΄λ¬ν μλ리μ€μμ μ μ©ν μ΅μ ν μ λ΅μ΄ λ μ μμ΅λλ€.
μ€μ μμ λ° μ¬μ© μ¬λ‘
λμ€ν¬λ¦½ν° νλ‘ν μ½μ λ§μ μ€μ©μ μΈ μ ν리μΌμ΄μ μ μ 곡ν©λλ€. λ€μμ λͺ κ°μ§ μ€λͺ μ μΈ μμμ λλ€:
1. μμ± μ ν¨μ± κ²μ¬λ₯Ό μν νλ‘νΌν°
νλ‘νΌν°λ λμ€ν¬λ¦½ν°μ μΌλ°μ μΈ μ¬μ© μ¬λ‘μ λλ€. μμ±μ λ°μ΄ν°λ₯Ό ν λΉνκΈ° μ μ λ°μ΄ν°λ₯Ό μ ν¨μ± κ²μ¬ν μ μμ΅λλ€:
class Rectangle:
def __init__(self, width, height):
self._width = width
self._height = height
@property
def width(self):
return self._width
@width.setter
def width(self, value):
if value <= 0:
raise ValueError('Width must be positive')
self._width = value
@property
def height(self):
return self._height
@height.setter
def height(self, value):
if value <= 0:
raise ValueError('Height must be positive')
self._height = value
@property
def area(self):
return self.width * self.height
# Example usage
rect = Rectangle(10, 20)
print(f'Area: {rect.area}') # Output: Area: 200
rect.width = 5
print(f'Area: {rect.area}') # Output: Area: 100
try:
rect.width = -1 # Raises ValueError
except ValueError as e:
print(e)
μ΄ μμμμ width λ° height νλ‘νΌν°λ κ°μ΄ μμμΈμ§ νμΈνκΈ° μν μ ν¨μ± κ²μ¬λ₯Ό ν¬ν¨ν©λλ€. μ΄λ κ°μ²΄μ μ ν¨νμ§ μμ λ°μ΄ν°κ° μ μ₯λλ κ²μ λ°©μ§νλ λ° λμμ΄ λ©λλ€.
2. μμ± μΊμ±
λμ€ν¬λ¦½ν°λ μΊμ± λ©μ»€λμ¦μ ꡬννλ λ° μ¬μ©λ μ μμ΅λλ€. μ΄λ κ³μ° λλ κ²μ λΉμ©μ΄ λ§μ΄ λλ μμ±μ μ μ©ν μ μμ΅λλ€.
import time
class ExpensiveCalculation:
def __init__(self, value):
self._value = value
self._cached_result = None
def _calculate(self):
# Simulate an expensive calculation
time.sleep(1) # Simulate a time consuming calculation
return self._value * 2
@property
def result(self):
if self._cached_result is None:
self._cached_result = self._calculate()
return self._cached_result
# Example usage
calculation = ExpensiveCalculation(5)
print('Calculating for the first time...')
print(calculation.result) # Calculates and caches the result.
print('Retrieving from cache...')
print(calculation.result) # Retrieves the result from the cache.
μ΄ μμλ κ°λΉμΌ μ°μ°μ κ²°κ³Όλ₯Ό μΊμνμ¬ ν₯ν μ κ·Ό μ μ±λ₯μ ν₯μμν€λ λ°©λ²μ 보μ¬μ€λλ€.
3. μ½κΈ° μ μ© μμ± κ΅¬ν
λμ€ν¬λ¦½ν°λ₯Ό μ¬μ©νμ¬ μ΄κΈ°νλ νμλ μμ ν μ μλ μ½κΈ° μ μ© μμ±μ λ§λ€ μ μμ΅λλ€.
class ReadOnly:
def __init__(self, value):
self._value = value
def __get__(self, instance, owner):
return self._value
def __set__(self, instance, value):
raise AttributeError('Cannot modify read-only attribute')
class Example:
read_only_attribute = ReadOnly(10)
# Example usage
example = Example()
print(example.read_only_attribute) # Output: 10
try:
example.read_only_attribute = 20 # Raises AttributeError
except AttributeError as e:
print(e)
μ΄ μμμμ ReadOnly λμ€ν¬λ¦½ν°λ read_only_attributeκ° μ½μ μλ μμ§λ§ μμ ν μλ μλλ‘ λ³΄μ₯ν©λλ€.
κΈλ‘λ² κ³ λ € μ¬ν
Pythonμ λμ μΈ νΉμ±κ³Ό κ΄λ²μν λΌμ΄λΈλ¬λ¦¬λ₯Ό ν΅ν΄ μ μΈκ³ λ€μν μ°μ μμ μ¬μ©λ©λλ€. μ λ½μ κ³Όν μ°κ΅¬μμ μλ©λ¦¬μΉ΄μ μΉ κ°λ°, μμμμ κΈμ΅ λͺ¨λΈλ§μμ μν리카μ λ°μ΄ν° λΆμμ μ΄λ₯΄κΈ°κΉμ§ Pythonμ λ€μ¬λ€λ₯ν¨μ λΆμΈν μ μμ΅λλ€. μμ± μ κ·Ό λ° λ μΌλ°μ μΌλ‘ λμ€ν¬λ¦½ν° νλ‘ν μ½μ λλ¬μΌ μ±λ₯ κ³ λ € μ¬νμ μμΉ, λ¬Ένμ λ°°κ²½ λλ μ°μ κ³Ό κ΄κ³μμ΄ PythonμΌλ‘ μμ νλ λͺ¨λ νλ‘κ·Έλλ¨Έμκ² λ³΄νΈμ μΌλ‘ κ΄λ ¨μ΄ μμ΅λλ€. νλ‘μ νΈκ° 볡μ‘ν΄μ§μ λ°λΌ λμ€ν¬λ¦½ν°μ μν₯μ μ΄ν΄νκ³ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ κ°λ ₯νκ³ ν¨μ¨μ μ΄λ©° μ μ§ κ΄λ¦¬κ° μ©μ΄ν μ½λλ₯Ό λ§λλ λ° λμμ΄ λ κ²μ λλ€. μΊμ±, νλ‘νμΌλ§ λ° μ¬λ°λ₯Έ λμ€ν¬λ¦½ν° μ ν μ νκ³Ό κ°μ μ΅μ ν κΈ°μ μ μ μΈκ³ λͺ¨λ Python κ°λ°μμκ² λμΌνκ² μ μ©λ©λλ€.
λ€μν μ§λ¦¬μ μμΉμ Python μ ν리μΌμ΄μ μ ꡬμΆνκ³ λ°°ν¬ν κ³νμ΄λΌλ©΄ κ΅μ νλ₯Ό κ³ λ €νλ κ²μ΄ νμμ μ λλ€. μ¬κΈ°μλ λ€μν μκ°λ, ν΅ν λ° μΈμ΄λ³ νμ μ§μ μ²λ¦¬κ° ν¬ν¨λ μ μμ΅λλ€. λμ€ν¬λ¦½ν°λ νΉν μ§μνλ μ€μ μ΄λ λ°μ΄ν° ννμ λ€λ£° λ μ΄λ¬ν μλλ¦¬μ€ μ€ μΌλΆμμ μν μ ν μ μμ΅λλ€. λμ€ν¬λ¦½ν°μ μ±λ₯ νΉμ±μ λͺ¨λ μ§μ λ° λ‘μΌμΌμμ μΌκ΄μ μ΄λΌλ μ μ κΈ°μ΅νμΈμ.
κ²°λ‘
λμ€ν¬λ¦½ν° νλ‘ν μ½μ μμ± μ κ·Όμ λν μΈλ°ν μ μ΄λ₯Ό κ°λ₯νκ² νλ Pythonμ κ°λ ₯νκ³ λ€μ¬λ€λ₯ν κΈ°λ₯μ λλ€. λμ€ν¬λ¦½ν°λ μ±λ₯ μ€λ²ν€λλ₯Ό μ λ°ν μ μμ§λ§, μ΄λ μ’ μ’ κ΄λ¦¬ κ°λ₯νλ©°, λμ€ν¬λ¦½ν° μ¬μ©μ μ΄μ (λ°μ΄ν° μ ν¨μ± κ²μ¬, μμ± μΊμ±, μ½κΈ° μ μ© μμ± λ±)μ΄ μ μ¬μ μΈ μ±λ₯ λΉμ©λ³΄λ€ ν° κ²½μ°κ° λ§μ΅λλ€. λμ€ν¬λ¦½ν°μ μ±λ₯ μν₯μ μ΄ν΄νκ³ , νλ‘νμΌλ§ λꡬλ₯Ό μ¬μ©νλ©°, μ΄ κΈμμ λ Όμλ μ΅μ ν μ λ΅μ μ μ©ν¨μΌλ‘μ¨ Python κ°λ°μλ λμ€ν¬λ¦½ν° νλ‘ν μ½μ λͺ¨λ κΈ°λ₯μ νμ©νλ ν¨μ¨μ μ΄κ³ μ μ§λ³΄μ κ°λ₯νλ©° κ²¬κ³ ν μ½λλ₯Ό μμ±ν μ μμ΅λλ€. λμ€ν¬λ¦½ν° ꡬνμ μ μ€νκ² νλ‘νμΌλ§νκ³ , λ²€μΉλ§νΉνκ³ , μ ννλ κ²μ μμ§ λ§μΈμ. λμ€ν¬λ¦½ν°λ₯Ό ꡬνν λλ λͺ νμ±κ³Ό κ°λ μ±μ μ°μ μνκ³ , μμ μ κ°μ₯ μ ν©ν λμ€ν¬λ¦½ν° μ νμ μ¬μ©νλλ‘ λ Έλ ₯νμΈμ. μ΄λ¬ν κΆμ₯ μ¬νμ λ°λ₯΄λ©΄ κΈλ‘λ² μ¬μ©μμ λ€μν μꡬλ₯Ό μΆ©μ‘±νλ κ³ μ±λ₯ Python μ ν리μΌμ΄μ μ ꡬμΆν μ μμ΅λλ€.