기술나눔

[Python 객체 지향] 프로그래밍 살펴보기: 새로운 시대의 고급 프로그래밍 패러다임에 대한 자세한 설명

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

목차

1. 객체지향 프로그래밍 개념(OOP)

1.1 클래스와 객체란 무엇입니까?

1.2 클래스 정의

1.3 클래스와 객체의 관계

1.4 Xiao Li의 이해

2. 추상화

2.1 추상적인 개념

2.2 추상 클래스와 메소드

2.3 Xiao Li의 이해

3. 클래스와 인스턴스

3.1 클래스 정의 및 인스턴스화

3.2 클래스 속성과 메소드

3.3 Xiao Li의 이해

4. 캡슐화/인터페이스

4.1 캡슐화의 개념

4.2 인터페이스의 개념

4.3 Xiao Li의 이해

5. 상속

5.1 상속의 개념

5.2 메소드 재작성

5.3 Xiao Li의 이해

6. 다형성

6.1 다형성의 개념

6.2 다형성 구현

6.3 Xiao Li의 이해

7. 성찰/반성

7.1 성찰의 개념

7.2 동적 작업에 인트로스펙션 사용하기

7.3 Xiao Li의 이해

8. 정적 메소드와 클래스 메소드

8.1 정적 메소드

8.2 클래스 메소드

요약하다


 

칼럼: 파이썬 연구 노트

이전 권: Python 모듈화 및 패키지 관리

1. 객체지향 프로그래밍 개념(OOP)

객체 지향 프로그래밍(OOP) 프로그램을 개체 모음으로 구성하여 구현되는 프로그래밍 패러다임입니다. 객체에는 데이터뿐만 아니라 해당 데이터를 조작하는 메서드도 포함됩니다. OOP의 핵심 개념에는 클래스, 개체, 속성 및 메서드가 포함됩니다.

1.1 클래스와 객체란 무엇입니까?

  • 수업 객체를 생성하는 데 사용되는 템플릿 또는 청사진입니다. 클래스는 객체의 속성과 동작을 정의합니다.
  • 물체 클래스의 인스턴스입니다. 객체를 생성한다는 것은 클래스를 기반으로 특정 인스턴스를 생성하는 것입니다.

예:

  1. class Dog:
  2. # 类的初始化方法
  3. def __init__(self, name, age):
  4. self.name = name # 属性
  5. self.age = age # 属性
  6. # 方法
  7. def bark(self):
  8. return f"{self.name} says Woof!"
  9. # 创建对象
  10. my_dog = Dog("Rex", 5)
  11. print(my_dog.bark())

1.2 클래스 정의

Python에서는 클래스가 통과합니다. class 키워드 정의. 클래스의 함수를 메서드라고 하고 변수를 속성이라고 합니다.클래스 메소드는 일반적으로 다음으로 시작합니다.self 첫 번째 매개변수는 인스턴스 자체를 나타냅니다.

예:

  1. class Cat:
  2. def __init__(self, name):
  3. self.name = name
  4. def meow(self):
  5. return f"{self.name} says Meow!"
  6. # 创建对象
  7. my_cat = Cat("Whiskers")
  8. print(my_cat.meow())

1.3 클래스와 객체의 관계

클래스는 객체의 템플릿이며 객체의 구조와 동작을 정의합니다. 객체는 클래스의 인스턴스이며 각 객체는 독립적인 속성과 메서드를 갖습니다.

  1. class Person:
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5. def greet(self):
  6. return f"Hello, my name is {self.name} and I am {self.age} years old."
  7. # 创建多个对象
  8. person1 = Person("Alice", 30)
  9. person2 = Person("Bob", 25)
  10. print(person1.greet())
  11. print(person2.greet())

1.4 Xiao Li의 이해

클래스는 쿠키 틀과 같아서 쿠키의 모양과 크기를 정의합니다. 객체는 틀로 만든 콘크리트 쿠키와 같습니다. 각 쿠키는 서로 다른 맛(속성)을 가질 수 있지만 모양과 크기(구조 및 동작)는 동일합니다.

2. 추상화

추상적인 이는 주요 기능을 포착하고 세부 사항을 무시하여 복잡한 실제 문제를 단순화하는 것을 의미합니다. 프로그래밍에서 추상화는 보다 간결하고 유지 관리 가능한 코드를 만드는 데 도움이 됩니다.

2.1 추상적인 개념

추상화는 중요하지 않은 세부 사항을 무시하면서 객체의 주요 특징을 추출하는 것입니다. 추상화를 통해 우리는 보조 기능에 방해받지 않고 객체의 핵심 기능에 집중할 수 있습니다.

예:

  1. class Animal:
  2. def __init__(self, name):
  3. self.name = name
  4. def make_sound(self):
  5. pass # 抽象方法,不具体实现
  6. class Dog(Animal):
  7. def make_sound(self):
  8. return "Woof!"
  9. class Cat(Animal):
  10. def make_sound(self):
  11. return "Meow!"
  12. # 创建对象
  13. dog = Dog("Rex")
  14. cat = Cat("Whiskers")
  15. print(dog.make_sound())
  16. print(cat.make_sound())

2.2 추상 클래스와 메소드

Python에서는 추상 클래스와 추상 메서드를 정의하여 추상화를 달성할 수 있습니다. 추상 클래스는 인스턴스화할 수 없으며 상속만 가능합니다. 추상 메서드는 추상 클래스에 정의되어 있지만 하위 클래스에서 구현됩니다.

예:

  1. from abc import ABC, abstractmethod
  2. class Vehicle(ABC):
  3. @abstractmethod
  4. def start_engine(self):
  5. pass
  6. class Car(Vehicle):
  7. def start_engine(self):
  8. return "Car engine started"
  9. class Motorcycle(Vehicle):
  10. def start_engine(self):
  11. return "Motorcycle engine started"
  12. # 创建对象
  13. car = Car()
  14. motorcycle = Motorcycle()
  15. print(car.start_engine())
  16. print(motorcycle.start_engine())

2.3 Xiao Li의 이해

추상화는 복잡한 그림을 기하학적 모양으로 줄이는 것과 같습니다. 예를 들어, 특정 고양이는 다양한 특성(털 색깔, 크기, 나이 등)을 가지고 있지만 우리는 단지 야옹거리는 특성에만 집중합니다. 이것이 바로 고양이의 추상화입니다.

3. 클래스와 인스턴스

클래스 및 인스턴스 OOP의 기초입니다. 클래스는 템플릿이고 인스턴스는 구체적인 객체입니다. 인스턴스는 클래스에서 생성되며 클래스에서 정의한 속성과 메서드를 갖습니다.

3.1 클래스 정의 및 인스턴스화

클래스 정의와 인스턴스 생성은 OOP의 기본 작업입니다. 클래스는 속성과 메서드를 정의하고 인스턴스는 클래스의 구체적인 개체입니다.

예:

  1. class Student:
  2. def __init__(self, name, grade):
  3. self.name = name
  4. self.grade = grade
  5. def introduce(self):
  6. return f"Hi, I am {self.name} and I am in grade {self.grade}."
  7. # 创建实例
  8. student1 = Student("Alice", 10)
  9. student2 = Student("Bob", 12)
  10. print(student1.introduce())
  11. print(student2.introduce())

3.2 클래스 속성과 메소드

클래스의 속성은 객체의 상태이고, 메소드는 객체의 동작입니다.클래스 속성 전달__init__ 메소드 초기화, 메소드는 클래스에 정의됩니다.

예:

  1. class Book:
  2. def __init__(self, title, author):
  3. self.title = title
  4. self.author = author
  5. def get_info(self):
  6. return f"'{self.title}' by {self.author}"
  7. # 创建实例
  8. book = Book("1984", "George Orwell")
  9. print(book.get_info())

3.3 Xiao Li의 이해

클래스와 인스턴스는 집과 실제 집을 그린 그림과 같습니다. 도면(클래스)은 집의 구조와 기능을 정의하는 반면, 실제 집(인스턴스)은 도면에 따라 지어진 콘크리트 객체입니다.

4. 캡슐화/인터페이스

캡슐화 객체의 상태(속성)와 동작(메서드)을 클래스 내부에 숨기고 인터페이스(메서드)를 통해 외부 세계와 상호 작용합니다. 캡슐화는 코드 보안과 유지 관리성을 향상시킵니다.

4.1 캡슐화의 개념

캡슐화는 OOP의 핵심 개념 중 하나입니다. 객체의 내부 상태를 숨기고 필요한 인터페이스만 노출하여 객체의 데이터를 보호합니다. 이런 방식으로 외부 코드는 객체의 내부 상태에 직접 접근하거나 수정할 수 없으며 객체가 제공하는 메서드를 통해서만 데이터를 조작할 수 있습니다.

예:

  1. class Account:
  2. def __init__(self, owner, balance=0):
  3. self.owner = owner
  4. self.__balance = balance # 私有属性
  5. def deposit(self, amount):
  6. if amount > 0:
  7. self.__balance += amount
  8. else:
  9. raise ValueError("Deposit amount must be positive")
  10. def withdraw(self, amount):
  11. if 0 < amount <= self.__balance:
  12. self.__balance -= amount
  13. else:
  14. raise ValueError("Insufficient funds or invalid amount")
  15. def get_balance(self):
  16. return self.__balance
  17. # 创建实例
  18. account = Account("John")
  19. account.deposit(100)
  20. print(account.get_balance())

4.2 인터페이스의 개념

인터페이스는 객체가 외부 세계와 상호 작용하는 유일한 방법입니다. 인터페이스를 통해 외부 코드는 객체의 메서드를 호출할 수 있지만 객체의 내부 상태에 직접 액세스할 수는 없습니다.

예:

  1. class Car:
  2. def __init__(self, model):
  3. self.model = model
  4. self.__engine_started = False
  5. def start_engine(self):
  6. if not self.__engine_started:
  7. self.__engine_started = True
  8. return "Engine started"
  9. else:
  10. return "Engine is already running"
  11. def stop_engine(self):
  12. if self.__engine_started:
  13. self.__engine_started = False
  14. return "Engine stopped"
  15. else:
  16. return "Engine is not running"
  17. # 创建实例
  18. car = Car("Toyota")
  19. print(car.start_engine())
  20. print(car.stop_engine())

4.3 Xiao Li의 이해

포장은 휴대폰 케이스와 같습니다. 휴대폰 내부의 회로와 구성 요소(물체의 상태)는 케이스 안에 캡슐화되어 있습니다. 사용자는 버튼과 화면(인터페이스)을 통해서만 휴대폰과 상호 작용할 수 있지만 내부 구성 요소에 직접 접촉할 수는 없습니다.

5. 상속

상속하다 OOP의 또 다른 핵심 개념으로, 기존 클래스를 기반으로 새 클래스를 생성할 수 있습니다. 새 클래스는 기존 클래스의 모든 속성과 메서드를 상속합니다.

5.1 상속의 개념

상속이란 한 클래스(하위 클래스)가 다른 클래스(부모 클래스)로부터 속성과 메서드를 얻는 경우를 말합니다. 상속을 통해 하위 클래스는 상위 클래스의 코드를 재사용하거나, 새 속성 및 메서드를 추가하거나, 상위 클래스의 메서드를 재정의할 수 있습니다.

예:

  1. class Animal:
  2. def __init__(self, name):
  3. self.name = name
  4. def speak(self):
  5. pass
  6. class Dog(Animal):
  7. def speak(self):
  8. return "Woof!"
  9. class Cat(Animal):
  10. def speak(self):
  11. return "Meow!"
  12. # 创建实例
  13. dog = Dog("Rex")
  14. cat = Cat("Whiskers")
  15. print(dog.speak())
  16. print(cat.speak())

5.2 메소드 재작성

하위 클래스는 상위 클래스의 메서드를 재정의할 수 있습니다. 즉, 다른 기능을 달성하기 위해 하위 클래스의 상위 클래스와 동일한 이름의 메서드를 정의할 수 있습니다.

예:

  1. class Shape:
  2. def area(self):
  3. return 0
  4. class Rectangle(Shape):
  5. def __init__(self, width, height):
  6. self.width = width
  7. self.height = height
  8. def area(self):
  9. return self.width * self.height
  10. class Circle(Shape):
  11. def __init__(self, radius):
  12. self.radius = radius
  13. def area(self):
  14. return 3.14 * (self.radius ** 2)
  15. # 创建实例
  16. rectangle = Rectangle(3, 4)
  17. circle = Circle(5)
  18. print(rectangle.area())
  19. print(circle.area())

5.3 Xiao Li의 이해

상속은 부모가 자녀에게 물려주는 유산과 같습니다. 부모(부모 클래스)는 자신의 속성(속성 및 메서드)을 자식(하위 클래스)에게 전달하고, 자식은 이러한 속성을 사용할 수 있을 뿐만 아니라 자신의 노력(새로운 속성 및 메서드 추가)을 통해 더욱 부유해집니다.

6. 다형성

다형성 이는 동일한 방법이 다른 객체에 대해 다른 표현을 갖는다는 것을 의미합니다. 다형성을 사용하면 동일한 인터페이스를 통해 다양한 개체의 메서드를 호출하여 다양한 기능을 수행할 수 있습니다.

6.1 다형성의 개념

다형성은 OOP의 중요한 기능 중 하나입니다. 이는 상위 클래스 참조를 통해 하위 클래스 객체를 가리키므로 동일한 메서드가 다른 구현을 가질 수 있습니다. 다형성은 코드 유연성과 확장성을 향상시킵니다.

예:

  1. class Animal:
  2. def speak(self):
  3. pass
  4. class Dog(Animal):
  5. def speak(self):
  6. return "Woof!"
  7. class Cat(Animal):
  8. def speak(self):
  9. return "Meow!"
  10. def animal_sound(animal):
  11. print(animal.speak())
  12. # 创建实例
  13. dog = Dog()
  14. cat = Cat()
  15. animal_sound(dog)
  16. animal_sound(cat)

 

6.2 다형성 구현

Python에서 다형성은 일반적으로 메서드 재정의 및 부모 클래스 참조를 통해 구현됩니다. 상위 클래스 참조를 통해 하위 클래스 객체를 가리키면 하위 클래스 메서드를 호출할 수 있습니다.

예:

  1. class Shape:
  2. def draw(self):
  3. pass
  4. class Rectangle(Shape):
  5. def draw(self):
  6. return "Drawing a rectangle"
  7. class Circle(Shape):
  8. def draw(self):
  9. return "Drawing a circle"
  10. def draw_shape(shape):
  11. print(shape.draw())
  12. # 创建实例
  13. rectangle = Rectangle()
  14. circle = Circle()
  15. draw_shape(rectangle)
  16. draw_shape(circle)

 

6.3 Xiao Li의 이해

다형성은 만능 리모콘과 같습니다. TV, 에어컨 또는 스테레오를 제어하든 이러한 장치에 해당 인터페이스(메서드)가 있는 한 리모콘(상위 클래스 참조)은 동일한 버튼(메서드 호출)을 통해 다양한 기능을 구현할 수 있습니다.

7. 성찰/반성

내성 이는 객체가 런타임에 자신의 정보를 알 수 있음을 의미합니다. Python은 다음과 같은 자체 검사를 위한 내장 함수를 제공합니다.type()id()hasattr() 기다리다.

7.1 성찰의 개념

내부 검사는 객체가 런타임에 속성, 메서드 등과 같은 자체 정보를 얻을 수 있음을 의미합니다. Introspection은 Python 프로그램을 매우 동적이고 유연하게 만듭니다.

예:

  1. class Person:
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5. person = Person("Alice", 30)
  6. # 使用内置函数进行自省
  7. print(type(person))
  8. print(hasattr(person, "name"))
  9. print(getattr(person, "name"))
  10. setattr(person, "name", "Bob")
  11. print(person.name)
  12. delattr(person, "name")

7.2 동적 작업에 인트로스펙션 사용하기

내부 검사를 통해 런타임에 객체의 속성과 메서드를 동적으로 조작할 수 있어 프로그램을 더욱 유연하고 동적으로 만들 수 있습니다.

예:

  1. class Car:
  2. def __init__(self, model):
  3. self.model = model
  4. self.speed = 0
  5. def accelerate(self):
  6. self.speed += 5
  7. return self.speed
  8. car = Car("Toyota")
  9. # 动态操作对象
  10. if hasattr(car, "accelerate"):
  11. method = getattr(car, "accelerate")
  12. print(method())
  13. print(method())
  14. # 动态设置属性
  15. setattr(car, "color", "red")
  16. print(car.color)

7.3 Xiao Li의 이해

자기 성찰은 거울을 보는 것과 같습니다. 거울(내성 메커니즘)을 통해 사람들은 자신의 모습(객체의 속성 및 방법)을 보고 필요에 따라 조정할 수 있습니다(객체의 동적 조작).

8. 정적 메소드와 클래스 메소드

정적 방법 그리고수업 방법 인스턴스가 아닌 클래스와 연결된 메서드입니다.정적 메소드 사용법@staticmethod 데코레이터, 클래스 메소드 사용법@classmethod 데코레이터.

8.1 정적 메소드

정적 메서드는 클래스의 메서드이지만 어떤 클래스 인스턴스에도 바인딩되지 않습니다. 정적 메서드는 클래스의 인스턴스에 액세스할 수 없으며 클래스 상태를 수정할 수도 없습니다. 일반적으로 클래스와 관련이 없지만 논리적으로 클래스의 기능에 속하는 일부 작업을 수행하는 데 사용됩니다.

예:

  1. class Math:
  2. @staticmethod
  3. def add(a, b):
  4. return a + b
  5. print(Math.add(5, 3))

 

8.2 클래스 메소드

클래스 메서드는 인스턴스가 아닌 클래스에 바인딩된 메서드입니다.클래스 메소드의 첫 번째 인수는 일반적으로 이름이 지정된 클래스 자체입니다.cls . 클래스 메서드는 클래스 속성과 다른 클래스 메서드에 액세스할 수 있습니다.

예:

  1. class Math:
  2. factor = 2
  3. @classmethod
  4. def multiply(cls, value):
  5. return cls.factor * value
  6. print(Math.multiply(5))

요약하다

객체 지향 프로그래밍, 추상화, 클래스 및 인스턴스, 캡슐화, 상속, 다형성, 내부 검사, 정적 및 클래스 메서드의 기본 개념을 포함하여 Python의 객체 지향 프로그래밍의 모든 측면입니다.

이 상세한 블로그가 여러분이 Python의 객체지향 프로그래밍을 깊이 이해하고 이 지식을 실제 프로젝트에 적용하는 데 도움이 되기를 바랍니다. 질문이 있거나 추가 도움이 필요하시면 언제든지 저에게 연락해주세요!