AI/Python

[Python] ν΄λž˜μŠ€μ™€ λ³€μˆ˜ + μ ‘κ·Όμ§€μ •μž getter, setter

i-moo 2025. 10. 1. 21:43
λ°˜μ‘ν˜•

πŸ“Œ 클래슀 λ³€μˆ˜(Class Variable)와 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(Instance Variable)

  • 클래슀 λ³€μˆ˜ : ν΄λž˜μŠ€κ°€ κ³΅μœ ν•˜λŠ” λ³€μˆ˜ (λͺ¨λ“  객체가 같은 값을 가짐)
  • μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ : κ°μ²΄λ§ˆλ‹€ λ…λ¦½μ μœΌλ‘œ κ°€μ§€λŠ” λ³€μˆ˜
class Person:
    # 클래슀 λ³€μˆ˜
    species = "Human"

    def __init__(self, alias):
        # μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
        self.alias = name

p = Person("Tom")

print(Person.species) #Human (클래슀 λ³€μˆ˜) 
print(p.species)  # Human (클래슀 λ³€μˆ˜)
print(p.alias)     # Tom   (μΈμŠ€ν„΄μŠ€ λ³€μˆ˜)

Person.species = "Changed" # 클래슀 λ³€μˆ˜ λ³€κ²½
p.alias = "Tony"		   # μΈμŠ€ν„΄μŠ€ λ³€μˆ˜

print(Person.species) # Changed (클래슀 λ³€μˆ˜)
print(p.species)	  # Changed (클래슀 λ³€μˆ˜)
print(p.alias)        # Tony   (μΈμŠ€ν„΄μŠ€ λ³€μˆ˜)

클래슀 λ³€μˆ˜λŠ” JAVAμ—μ„œ static λ³€μˆ˜ 같은 λ™μž‘μœΌλ‘œ λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅μœ λœλ‹€.
μ½”λ“œμ—μ„œ 보면 Person.species = "Changed"λ©΄ p 객체의 species 값도 λ³€κ²½λ˜κ²Œ λœλ‹€.

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” κ°μ²΄λ§ˆλ‹€ 독립적인 값을 κ°€μ§€λ―€λ‘œ, Person.* μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” μ ‘κ·Όν•  수 μ—†λ‹€.

p = Person("Tom")

print(Person.species)
print(p.species)  # Human (클래슀 λ³€μˆ˜)

p.species = "Changed" # p 객체의 클래슀 λ³€μˆ˜ λ³€κ²½

print(Person.species) # Person의 클래슀 λ³€μˆ˜
print(p.species)	  # p 객체의 클래슀 λ³€μˆ˜

클래슀 자체λ₯Ό μ ‘κ·Όν•˜λŠ”κ²Œ μ•„λ‹Œ μƒμ„±λ˜μ–΄ μžˆλŠ” 클래슀 객체의 클래슀 λ³€μˆ˜λ₯Ό μ ‘κ·Όν•˜κ²Œ λœλ‹€λ©΄,
클래슀 λ³€μˆ˜κ°€ λ³€κ²½λ˜λŠ” 것이 μ•„λ‹ˆλΌ p객체의 μΈμŠ€ν„΄μŠ€ species λ³€μˆ˜λ₯Ό μƒμ„±ν•˜κ²Œ λœλ‹€.

κ·Έλž˜μ„œ p.species λ³€μˆ˜λ₯Ό 좜λ ₯ν–ˆμ„ λ•Œλ§Œ λ³€κ²½λœ 값이 λ‚˜μ˜€κ²Œ 됨.

πŸ“Œ @classmethod λ°μ½”λ ˆμ΄ν„° ν™œμš©

class Person:
    # 클래슀 λ³€μˆ˜
    species = "Human"

	@classmethod
    def set_species(cls, new_value):
    	cls.species = new_value
        
print(Person.species)		  # 클래슀 λ³€μˆ˜
Person.set_species("Changed") # 클래슀 λ©”μ†Œλ“œ
print(Person.species) 		  # λ³€κ²½λœ 클래슀 λ³€μˆ˜ : Changed

πŸ“Œ  μ ‘κ·Ό μ§€μ •μž (Public, Protected, Private)

Pythonμ—λŠ” μ ‘κ·Ό μ§€μ •μžκ°€ μ—†λ‹€.

λŒ€μ‹ , λ³€μˆ˜ 이름 μ•žμ— μ–Έλ”μŠ€μ½”μ–΄(_)λ₯Ό λΆ™μ—¬ μ ‘κ·Ό μ œν•œ μ˜λ„λ₯Ό ν‘œν˜„ν•  수 μžˆλ‹€. 

Public alias λ‚΄μ™ΈλΆ€ μ ‘κ·Ό κ°€λŠ₯
Protected _alias λ‚΄μ™ΈλΆ€ μ ‘κ·Ό κ°€λŠ₯
but, μ§€μ–‘ν•˜λΌκ³  의미λ₯Ό ν‘œν˜„
Private __alias μ™ΈλΆ€ μ ‘κ·Ό λΆˆκ°€λŠ₯
λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯
class Sample:
    def __init__(self):
        self.public_var = "곡개"
        self._protected_var = "보호"
        self.__private_var = "λΉ„κ³΅κ°œ"

obj = Sample()
print(obj.public_var)      # κ°€λŠ₯
print(obj._protected_var)  # κ°€λŠ₯ν•˜μ§€λ§Œ ꢌμž₯ X
# print(obj.__private_var) # μ—λŸ¬ (직접 μ ‘κ·Ό λΆˆκ°€)

 

사싀 __private_var도 μ ‘κ·Όν•˜λ €κ³  ν•˜λ©΄ 접근이 κ°€λŠ₯ν•˜λ‹€.
λ³€μˆ˜λͺ… μ•žμ— "_{Class_Name}"을 뢙이면 λ˜λŠ”λ° __private_var의 κ²½μš°λŠ” _Sample__private_var둜 μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.
ν•˜μ§€λ§Œ μ„œλ‘œ λ‚΄λΆ€ λ³€μˆ˜λ‘œ μ ‘κ·Όν•˜μ§€ 말자고 μ•½μ†ν•œ κ²ƒμ΄κΈ°λ•Œλ¬Έμ— μ ‘κ·Όν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ μ•ˆλ¨.

클래슀 λ³€μˆ˜λ₯Ό 직접 μˆ˜μ •ν•˜λŠ” 것을 막고, λ©”μ„œλ“œλ₯Ό 톡해 μ ‘κ·Όν•˜κ²Œ ν•˜λŠ” ν˜•νƒœλ‘œ getter, setter κΈ°λŠ₯을 κ΅¬ν˜„ν•΄μ•Όν•œλ‹€. (μΊ‘μŠν™”)

    # Getter
    def get_private_var(self):
        return self.__private_var
    
    # Setter
    def set_private_var(self, new_private_var):
        if len(new_private_var) > 1:    # μœ νš¨μ„± 검사
            self.__private_var = new_private_var
        else:
            print("ν•œ κΈ€μž 이상이어야 ν•©λ‹ˆλ‹€!")

πŸ“Œ @property λ°μ½”λ ˆμ΄ν„° ν™œμš© (Pythonic Way ✨)

Pythonμ—μ„œ Getter/Setter λ©”μ„œλ“œ λŒ€μ‹  @property λ°μ½”λ ˆμ΄ν„°λ₯Ό μ΄μš©ν•˜λŠ” 편.

class Sample:
    def __init__(self):
        self.__private_var = "λΉ„κ³΅κ°œ"

    @property
    def private_var(self):						# Getter
        return self.__private_var
    
	@private_var.setter
    def private_var(self, new_private_var):     # Setter
        if len(new_private_var) > 1:
            self.__private_var = new_private_var
        else:
            print("ν•œ κΈ€μž 이상이어야 ν•©λ‹ˆλ‹€!")

obj = Sample()
print(obj.private_var)  # λΉ„κ³΅κ°œ

obj.private_var = "μƒˆλ‘œμš΄ λ³΄μ•ˆ"

print(obj.private_var)  # μƒˆλ‘œμš΄ λ³΄μ•ˆ
λ°˜μ‘ν˜•