Introduction to class attributes
class Circle:
def __init__(self, radius):
self.pi = 3.14159
self.radius = radius
def area(self):
return self.pi * self.radius**2
def circumference(self):
return 2*self.pi * self.radius
Circle 클래스에는 pi와 radius라는 두 가지 속성이 있습니다. 또한 원의 면적과 둘레를 계산하는 두개의 메서드가 있습니다.
pi와 radius는 모두 인스턴스 속성이라고 합니다.
즉, Circle 클래스의 속성 인스턴스에 속합니다. 인스턴스의 속성을 변경해도 다른 인스턴스에는 영향을 주지 않습니다.
인스턴스 속성 외에도 Python은 클래스 속성도 지원합니다.
클래스 특성은 클래스의 속성 인스턴스와 연결되지 않습니다. 그러나 클래스의 모든 인스턴스에서 공유됩니다.
클래스 속성을 정의하려면 __init__() 메서드 외부에서 클래스 속성을 사용합니다 .
예를 들어, 다음은 pi를 클래스 속성으로 정의합니다.
class Circle:
pi = 3.14159
def __init__(self, radius):
self.radius = radius
def area(self):
return self.pi * self.radius**2
def circumference(self):
return 2 * self.pi * self.radius
그런 다음 클래스의 인스턴스 또는 클래스 이름을 통해 class 속성에 액세스할 수 있습니다.
object_name.class_attribute
class_name.class_attribute
area() 및 circumference() 메서드에서는 self 변수를 통해 pi 클래스 속성에 액세스합니다.
Circle 클래스 외부에서는 Circle 클래스의 인스턴스를 통해 또는 Circle 클래스를 통해 직접 pi 클래스 속성에 액세스할 수 있습니다 . 예를 들어:
c = Circle(10)
print(c.pi)
print(Circle.pi)
Output:
3.14159
3.14159
How Python class attributes work
클래스의 인스턴스를 통해 속성에 액세스하면 Python은 인스턴스 속성 목록에서 속성을 검색합니다. 인스턴스 속성 목록에 해당 속성이 없는 경우, 파이썬은클래스 속성 목록에서 속성을 계속 찾습니다. Python은 인스턴스 속성 목록 또는 클래스 속성 목록에서 속성을 찾는 한 속성 값을 반환합니다.
그러나 클래스 속성에 직접 액세스하는 경우 Python은 클래스 속성 목록에서 속성을 직접 검색합니다.
다음 예제에서는 Test 클래스를 정의하여 Python이 인스턴스 및 클래스 특성을 처리하는 방법을 보여 줍니다.
class Test:
x = 10
def __init__(self):
self.x = 20
test = Test()
print(test.x) # 20
print(Test.x) # 10
When to use Python class attributes
클래스 속성은 클래스 상수 저장, 모든 인스턴스에서 데이터 추적, 기본값 정의와 같은 경우에 유용합니다.
1) Storing class constants
상수는 클래스의 인스턴스에서 인스턴스로 변경되지 않으므로 클래스 속성으로 저장하는 것이 편리합니다.
예를 들어, Circle 클래스에는 클래스의 모든 인스턴스에 대해 동일한 pi 상수가 있습니다. 외부에서 클래스 속성 pi의 값을 가져 올수는 있어도 값 변경은 불가하다. (즉, 값 변경 불가 -> 인스턴스 속성 새로 생성)
class Circle:
position = (10,20)
def __init__(self, radius):
self.pi = 3.14159
self.radius = radius
s = Circle(20)
s.position = (100,200) # 인스턴스 s의 속성 생성 후 (100,200) 할당
print(Circle.position) # 클래스 속성 값 반환 (10,20)
print(s.position) # 인스턴스 속성 값 반환 (100, 200)
Circle.position = (2000,9000) # 클래스 속성 값 변경
print(Circle.position) # (2000,9000)
2) Tracking data across of all instances
다음은 circle_list 클래스 특성을 Circle 클래스에 추가합니다 . Circle 클래스의 새 인스턴스를 만들면 생성자가 해당 인스턴스를 목록에 추가합니다.
class Circle:
circle_list = []
pi = 3.14159
def __init__(self, radius):
self.radius = radius
# add the instance to the circle list
self.circle_list.append(self)
def area(self):
return self.pi * self.radius**2
def circumference(self):
return 2 * self.pi * self.radius
c1 = Circle(10)
c2 = Circle(20)
print(len(Circle.circle_list)) # 2
3) Defining default values
때로는 클래스의 모든 인스턴스에 대해 기본값을 설정하려고합니다. 이 경우 class 속성을 사용할 수 있습니다.
다음 예제에서는 Product 클래스를 정의합니다. Product 클래스의 모든 인스턴스에는 default_discount 클래스 속성 값이 할당됩니다.
class Product:
default_discount = 0
def __init__(self, price):
self.price = price
self.discount = Product.default_discount
def set_discount(self, discount):
self.discount = discount
def net_price(self):
return self.price * (1 - self.discount)
p1 = Product(100)
print(p1.net_price()) # 100
p2 = Product(200)
p2.set_discount(0.05)
print(p2.net_price()) # 190
Summary
- 클래스 속성은 클래스의 모든 인스턴스에서 공유합니다. 클래스 속성을 정의하려면 __init__() 메서드 외부에 배치합니다.
- class_name.class_ attribute 또는 object_name.class_ attribute 을 사용하여 class_attribute 값에 액세스합니다.(self 우선 cls 후순위 검색)
- 클래스속성을 사용하여 클래스 상수를 저장하고, 모든 인스턴스에서 데이터를 추적하고, 클래스의 모든 인스턴스에 대한 기본값을 설정할 때 유용.
'Python Object-oriented Programming' 카테고리의 다른 글
Methods (0) | 2023.04.02 |
---|---|
Class Variables (0) | 2023.04.02 |
Class (0) | 2023.04.02 |
Callable (0) | 2023.04.02 |
Object-oriented Programming (0) | 2023.04.02 |
댓글