개발자/라즈베리파이4

라즈베리파이 Python Programming 10: 객체 지향 Python

지구빵집 2021. 11. 5. 10:20
반응형

 

 

라즈베리파이 Python Programming 10: 객체 지향 Python 

 

이전의 튜토리얼에서 순서 및 정렬되지 않은 컬렉션에서 적용되는 작업, 기능 및 방법을 포함 파이썬에 대해 알아보았습니다. 그러나 응용 프로그램에는 사용자 정의 클래스 및 개체라고 하는 더 복잡한 데이터 구조가 있을 수 있습니다.

 

모든 애플리케이션은 데이터(값/객체/사용자 정의 클래스/객체)와 코드 동작(데이터가 조작되는 방식)을 사용합니다.

 

애플리케이션이 다음에 중점을 둔 방식으로 설계된 경우:

 

  • 기능(코드 동작) – 절차적 또는 기능적 프로그래밍이라고 합니다.
  • 데이터(값/객체/사용자 정의 객체) – 객체 지향 프로그래밍이라고 합니다.

 

Python은 객체 지향 프로그래밍 언어이지만 애플리케이션이 이러한 유형의 디자인 패턴으로 정의되도록 강제하지는 않습니다. 이는 절차 및 MVC(모델 보기 제어) 사용을 포함하여 다양한 패턴으로 응용 프로그램을 설계할 수 있음을 의미합니다. 하나의 응용 프로그램에서 많은 디자인 패턴을 혼합하는 것도 가능합니다.

 

그러나 Python의 객체 지향 기능은 사용자 정의 데이터 구조를 만들고 특정 응용 프로그램을 효율적으로 설계하는 데 유용하므로 살펴볼 가치가 있습니다.

 

Python 클래스

 

클래스는 실제 객체 또는 데이터 구조의 청사진과 유사합니다. 따라서 모든 응용 프로그램에서 클래스는 실제 개체 또는 데이터 구조를 나타낼 수 있습니다.

 

객체/데이터 구조의 속성은 클래스의 속성으로 정의됩니다. 속성은 내장 또는 사용자 정의 개체를 포함할 수 있는 참조입니다. 클래스에는 연관된 속성을 바인딩하거나 조작하는 기능이 있을 수도 있습니다. 이러한 기능을 메서드라고 합니다.

 

Python에서는 속성과 메서드 간에 차이가 없습니다. 메서드는 호출 가능한 속성으로 처리됩니다.

 

Python 클래스는 다른 객체를 생성하기 위한 유형으로 사용할 수 있는 객체이기도 합니다. Python의 데이터 유형도 객체이지만 다른 객체의 유형을 정의하는 데 사용됩니다. 객체가 특정 클래스 유형으로 생성되면 해당 클래스의 인스턴스 또는 인스턴스 객체라고 합니다.

 

인스턴스 객체에는 해당 클래스에 대해 정의된 모든 속성(호출 불가 및 호출 가능)이 있습니다. 해당 클래스에서 상속된 개체의 일부 속성은 기본 데이터 값을 가질 수 있습니다. 이러한 호출 불가능 및 호출 가능 속성을 설명자라고 합니다. 모든 개체에는 정의된 추가 속성이 있을 수 있습니다.

 

클래스는 상위 클래스를 슈퍼 클래스라고 하는 다른 클래스의 하위 클래스일 수 있습니다. 객체가 해당 클래스의 속성을 상속하는 것과 마찬가지로 해당 클래스가 하위 클래스인 경우 암시적으로 상위 클래스의 속성을 상속합니다. 또한 하위 클래스는 상위 클래스의 속성과 메서드를 암시적으로 상속합니다.

 

class 문은 클래스를 정의하며 다음 구문을 사용하는 복합 문입니다.

 

class className (base-classes)
statement(s)

 

className은 클래스에 대한 참조 역할을 하는 모든 식별자일 수 있습니다. 클래스 정의는 기본 클래스를 쉼표로 구분된 인수로 가질 수 있습니다. 기본 클래스는 상위 클래스이며 해당 클래스는 하위 클래스입니다. 기본 클래스는 선택 사항이며 정의된 클래스가 다른 클래스의 하위 클래스인 경우에만 포함되어야 합니다.

 

이것은 클래스를 객체로 사용하는 이상적인 예입니다. 기본 클래스가 인수로 전달되면 Python은 이를 객체로 취급합니다. 클래스 정의에 포함된 명령문을 클래스 본문이라고 합니다.

 

클래스에 바인딩되는 속성(호출 불가 또는 호출 가능)을 클래스 속성이라고 합니다. 이러한 속성은 클래스 본문 내부와 클래스 정의 외부에서 정의할 수 있습니다. 클래스 속성은 class_name.attribute_name 구문으로 액세스 됩니다.

 

다음은 클래스 본문 내에서 클래스 속성을 정의하는 유효한 예입니다.

 

class C1():
x = 25
print(C1.x)

 

이제 다음은 클래스 정의 외부에서 클래스 속성을 정의하는 유효한 예입니다.

 

class C1():
pass
C1.x = 25
print(C1.x)

 

클래스에 바인딩된 함수를 메서드라고 합니다. 클래스 속성이 클래스 본문에 정의되어 있더라도 메서드 정의를 사용할 때 class_name.attribute_name 구문에서 참조해야 합니다.

 

다음은 클래스 속성에 액세스 하는 메서드의 유효한 예입니다.

 

class C1():
x = 25
def m():
C1.x +=1
print(C1.x)

 

속성이 호출되고 식별자가 해당 클래스 속성에 대한 참조로 사용되거나 메서드가 두 개의 밑줄로 시작하는 경우 선행 밑줄이 있는 클래스 이름이 속성 이름 앞에 접두사로 붙습니다. 따라서 식별자 __getData가 호출되면 Python 컴파일러는 암시적으로 식별자를 _className__getData로 변경합니다.

 

이러한 식별자를 개인 이름 또는 클래스 개인 변수라고 합니다. 이렇게 하면 클래스에 바인딩된 속성 및 메서드에 대한 참조가 비공개로 설정되고 코드의 다른 참조와 충돌할 가능성이 줄어듭니다.

 

클래스는 참조에 사용되는 식별자의 일부로 선행 및 후행 밑줄 두 개가 있는 특수 메서드를 가질 수도 있습니다. 예를 들어 __init__, __get__, __set__ 및 __delete__는 클래스에서 제공할 수 있는 특수 메서드입니다.

 

이러한 암시적 메서드는 모든 클래스에서 특별한 목적을 가지며 dunder 메서드, 매직 메서드 또는 특수 메서드라고 합니다.

 

일부 클래스 속성에는 관리 액세스가 있을 수 있습니다. 데이터 값은 dunder 메서드를 통해서만 바인딩, 리바인드 또는 바인딩 해제할 수 있습니다. __init__ 메서드에서 기본 데이터 값/객체에 바인딩하는 방법과 유사하게 다음을 수행할 수 있습니다.

 

  • __get__ 메서드를 통해서만 값을 반환합니다.
  • __set__ 메서드를 통해서만 값을 수정하십시오.
  • __delete__ 메서드를 통해서만 삭제할 수 있습니다.

 

이러한 속성을 초기화, 가져오기, 설정 또는 삭제하려면 __init__, __get__, __set__ 및 __delete__ 메서드를 적절한 명령문과 함께 클래스 본문에 명시적으로 정의해야 합니다.

 

이러한 속성을 설명자라고 합니다. 설명자에 __set__ 메서드가 정의되어 있지 않으면 해당 값을 변경할 수 없습니다. 이러한 디스크립터를 nonoverriding 또는 nondata 디스크립터라고 합니다. 설명자에 __set__ 메서드가 정의되어 있으면 해당 값은 __set__ 메서드를 호출하여 코드에서 변경할 수 있습니다.

 

값이 있는 설명자는 변경될 수 있으며 재정의 설명자라고 합니다. 이러한 설명자는 일반 할당 문을 통해 바인딩, 리바인드 또는 바인딩 해제할 수 없습니다.

 

다음은 설명자의 유효한 예입니다.

 

class C1(object):
def __init__(self, value):
self.value = value
def __set__(self, *_):
pass
def __get__(self, *_):
return self.value
class C2(object):
c = C1(25)
x = C2() #instance object of class C2|
print(x.c) # Prints 25
x.c = 52
print(x.c) # Still Prints 25

 

클래스 인스턴스 클래스

 

의 인스턴스(인스턴스 객체)를 생성할 때 클래스 객체에 함수로 참조를 할당할 수 있습니다.

 

다음은 인스턴스를 만드는 유효한 예입니다.

 

X = C1() #C1 is a class

 

__init__ 메서드가 클래스에 제공되면 해당 메서드의 기본 속성 초기화가 있을 수 있습니다. 인스턴스가 생성되면 초기화를 수행하기 위해 모든 필수 인수를 인스턴스화에 전달해야 합니다.

 

다음은 예입니다.

 

class C1(object):
def __init__(self, value1, value2):
self.a = value1
self.b = value2
y = C1(25, 34)
print(y.a) #Prints 25
print(y.b) #Prints 34

 

이 경우 __init__는 다른 객체 지향 언어의 생성자 함수처럼 작동합니다. 인스턴스는 해당 클래스의 상위 클래스에서 __init__ 메서드를 상속할 수도 있습니다. 인스턴스화에서 클래스 또는 해당 상위 클래스에 대해 정의된 __init__ 메서드가 없는 경우 클래스는 인수 없이 호출되어야 합니다.

 

이는 인스턴스별 인수가 없어야 함을 의미합니다. 또한 __init__ 메서드는 None 이외의 값을 반환할 수 없습니다. 인스턴스는 클래스 본문이나 해당 클래스에 대해 정의되지 않은 고유한 속성을 가질 수 있습니다.

 

참조에 함수를 할당하여 인스턴스를 생성하는 것도 가능합니다. 이 경우 함수는 클래스 개체를 반환해야 합니다. 이러한 함수를 팩토리 함수라고 합니다.

 

상속

 

상속은 객체 지향 프로그래밍의 강력한 기능입니다. 우리가 논의한 바와 같이, 모든 클래스 정의는 인수인 기본 클래스를 가질 수 있습니다. 그런 다음 이러한 클래스를 하위 클래스라고 하고 기본 클래스를 상위 클래스 또는 상위 클래스라고 합니다.

 

하위 클래스는 기본 클래스의 모든 속성과 메서드를 암시적으로 상속합니다. 마찬가지로, 하위 클래스의 인스턴스는 해당 클래스의 기본 클래스뿐만 아니라 해당 클래스의 모든 속성과 메서드를 상속합니다. 부모 객체에서 상속된 속성과 메서드의 이러한 기능을 객체 지향 패러다임에서 상속이라고 합니다.

 

클래스에는 여러 기본 클래스가 있을 수 있습니다. 따라서 모든 기본 클래스에서 속성과 메서드를 상속합니다. 이것을 다중 상속이라고 합니다. 기본 클래스에 다른 기본 클래스가 있을 수도 있습니다. 그렇다면 개체는 기본 클래스와 기본 클래스의 기본 클래스에서 특성과 메서드를 상속합니다. 이것을 다단계 상속이라고 합니다.

 

다음 튜토리얼에서 파이썬에 그래픽 인터페이스를 설계하는 방법을 다룹니다. 

 

 

 

 

 

반응형