본문 바로가기
Python Object-oriented Programming

Class attributes

by 자동매매 2023. 4. 2.

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

댓글