본문 바로가기
Python Object-oriented Programming

Object-oriented Programming

by 자동매매 2023. 4. 2.

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

댓글