Introduction to Python Object-oriented Programming
파이썬의 모든 것은 object(개체)입니다. 개체에는 state(상태), behaviors(동작)이 있습니다. 개체를 만들려면 먼저 클래스를 정의합니다. 그런 다음 클래스에서 하나 이상의 개체를 만들 수 있습니다. 개체는클래스의 인스턴스입니다.
Define a class
클래스를 정의하려면 class 키워드 뒤에 클래스 이름을 사용합니다. 예를 들어, 다음은 Person 클래스를 정의합니다.
class Person:
pass
Person 클래스에서 객체를 만들려면 함수를 호출하는 것처럼 클래스 이름 뒤에 괄호 ()를 사용합니다.
person = Person()
이 예제에서 person은 Person 클래스의 인스턴스입니다. 클래스는 호출할 수 있습니다.
Define instance attributes
파이썬은 동적입니다. 이는 런타임에 동적으로 클래스의 인스턴스에 속성을 추가할 수 있음을 의미합니다.
예를 들어 다음은 person 개체에 name 속성을 추가합니다.
person.name = 'John'
그러나 다른 Person 개체를 만드는 경우 새 개체에는 name 속성이 없습니다.
클래스의 모든 인스턴스에 대한 속성을 정의하고 초기화하려면 __init__ 메서드를 사용합니다. 다음은 두 개의 인스턴스 속성 name과 age가 있는 Person 클래스를 정의합니다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
Person 객체를 만들 때 Python은 자동으로 __init__ 메서드를 호출하여 인스턴스 속성을 초기화합니다. __init__ 메서드 에서 self는 Person 클래스의 인스턴스입니다.
다음은 person이라는 Person 개체를 만듭니다.
person = Person('John', 25)
이제 person 개체에 name 및 age 속성이 있습니다. 인스턴스 속성에 액세스하려면 dot notation을 사용합니다. 예를 들어, 다음은 person 객체의 name 속성 값을 반환합니다.
person.name
Define instance methods
다음은 Person 클래스에 greet()라는 인스턴스 메서드를 추가합니다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
return f"Hi, it's {self.name}."
인스턴스 메서드를 호출하려면 dot donation도 사용합니다. 예를 들어:
person = Person('John', 25)
print(person.greet())
Output:
Hi, it's John
Define class attributes
인스턴스 속성과 달리 클래스 속성은 클래스의 모든 인스턴스에서 공유됩니다. 클래스의 인스턴스 수를 추적하는 클래스 상수 또는 변수를 정의하려는 경우에 유용합니다.
예를 들어, 다음은 Person 클래스의 counter 클래스 속성을 정의합니다.
class Person:
counter = 0
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
return f"Hi, it's {self.name}."
Person 클래스에서 counter 속성에 액세스할 수 있습니다.
Person.counter
또는 Person 클래스의 모든 인스턴스에서 접근 :
person = Person('John',25)
person.counter
카운터 변수를 더 유용하게 만들려면 개체를 만든 후 값을 1씩 늘릴 수 있습니다. 이렇게 하려면 __init__ 메서드에서 counter 클래스 속성을 늘립니다.
class Person:
counter = 0
def __init__(self, name, age):
self.name = name
self.age = age
Person.counter += 1
def greet(self):
return f"Hi, it's {self.name}."
다음은 Person 클래스의 두 인스턴스를 만들고 counter의 값을 보여 줍니다.
p1 = Person('John', 25)
p2 = Person('Jane', 22)
print(Person.counter)
Output:
2
Define class method
class 속성과 마찬가지로 클래스 메서드는 클래스와 클래스의 모든 인스턴스에서 공유됩니다. 클래스 메서드의 첫 번째 인수는 클래스 자체입니다. 규칙에 따라 이름은 cls입니다. 파이썬은 자동으로 이 인수를 클래스 메서드에 전달합니다. 또한 @classmethod 데코레이터를 사용하여 클래스 메서드를 데코레이팅합니다.
다음 예제에서는 anonymous Person 개체를 반환하는 클래스 메서드를 정의합니다.
class Person:
counter = 0
def __init__(self, name, age):
self.name = name
self.age = age
Person.counter += 1
def greet(self):
return f"Hi, it's {self.name}."
@classmethod
def create_anonymous(cls):
return Person('Anonymous', 22)
create_anonymous() 클래스 메서드를 호출하는 방법은 다음과 같습니다.
anonymous = Person.create_anonymous()
print(anonymous.name) # Anonymous
person1 = Person('John',22)
person2=person1.create_anonymous()
print(person2.name) # Anonymous
Define static method
static method(정적 메서드)는 클래스 또는 클래스의 인스턴스에 바인딩되지 않습니다. Python에서는 정적 메서드를 사용하여 클래스에서 논리적으로 관련된 함수를 그룹화합니다. 정적 메서드를 정의하려면 @staticmethod 데코레이터를 사용합니다.
예를 들어, 다음은 섭씨에서 화씨로 또는 그 반대로 변환하는 두 개의 정적 메서드가 있는 온도 변환기를 정의합니다.
class TemperatureConverter:
@staticmethod
def celsius_to_fahrenheit(c):
return 9 * c / 5 + 32
@staticmethod
def fahrenheit_to_celsius(f):
return 5 * (f - 32) / 9
정적 메서드를 호출하려면 ClassName.static_method_name() 구문을 사용합니다 . 예를 들어:
f = TemperatureConverter.celsius_to_fahrenheit(30)
print(f) # 86
파이썬은 정적 메소드의 첫 번째 인수로 인스턴스 (self)와 클래스 (cls)를 전달하지 않습니다.
Single inheritance
클래스는 다른 클래스를 상속하여 다시 사용할 수 있습니다. 자식 클래스가 부모 클래스에서 상속되면 자식 클래스는 부모 클래스의 속성과 메서드에 액세스할 수 있습니다.
예를 들어 Person 클래스에서 상속되는 Employee 클래스를 정의할 수 있습니다.
class Employee(Person):
def __init__(self, name, age, job_title):
super().__init__(name, age)
self.job_title = job_title
Employee 클래스의 __init__ 메서드 내에서 Person 클래스의 __init__메서드를 호출 하여 name 및 age 속성을 초기화합니다 . super()를 사용하면 자식 클래스가 부모 클래스의 메서드에 액세스할 수 있습니다.
Employee 클래스는 job_title이라는 속성을 하나 더 추가하여 Person 클래스를 확장합니다.
Person은 부모 클래스이고 Employee 은 자식 클래스입니다. Person 클래스에서 greet() 메서드를 override(재정의)하려면 다음과 같이 Employee 클래스에서 greet() 메서드를 재정의할 수 있습니다.
class Employee(Person):
def __init__(self, name, age, job_title):
super().__init__(name, age)
self.job_title = job_title
def greet(self):
return super().greet() + f" I'm a {self.job_title}."
Employee 의 greet() 메서드는 Person 클래스의 greet() 메서드라고도 합니다 . 즉, 부모 클래스의 메서드에 대한 delegate(위임)합니다.
다음은 Employee 클래스의 새 인스턴스를 만들고 greet() 메서드를 호출합니다.
employee = Employee('John', 25, 'Python Developer')
print(employee.greet())
Output:
Hi, it's John. I'm a Python Developer.
'Python Object-oriented Programming' 카테고리의 다른 글
Class (0) | 2023.04.02 |
---|---|
Callable (0) | 2023.04.02 |
Property Decorator (0) | 2023.04.01 |
Metaclass Example (0) | 2023.04.01 |
Metaclass (0) | 2023.04.01 |
댓글