Appia의 IT세상

파이썬[Python] 012 클래스(Class) 및 상속 본문

Python/Python 기본

파이썬[Python] 012 클래스(Class) 및 상속

Appia 2019. 12. 27. 13:23
반응형

오늘은 객체지향의 꽃인 클래스에 대해서 살펴보도록 하겠습니다. 파이썬[Python] 객체 지향성(Obeject Oriented Programming) 언어입니다. , 기본적인 속성 특성들에 대해서 정의 해두고, 이를 바탕으로 인스턴스를 만들어 사용하는 원리입니다.

 

물론 무엇이든지 과하면 못하다는 과유불급이라는 사자성어가 있습니다. , 모든 부분에서 클래스를 만들어 사용하는 것은 좋지 않다고 생각하는 것이 저의 생각입니다. 실제 객체의 특성들이 동일한 부분에 적용하기 좋습니다만, 밖에서는 효율적이지 않습니다.

 

일단 먼저 생성하는 방법에 대해서 살펴 보도록 하겠습니다.

 

   class ClassName:

          'Optional class documentation string'

          <클래스 내부>

 

실제 상위 부분에서는 클래스에 대해서 정의 하는 부분입니다. 실제 정의만 가지고는 아무런 효과가 없습니다. , 인스턴스가 존재해야지만, 부분이 의미가 있습니다.

 

그럼 다음과 같은 예시를 만들어 보겠습니다.

 

class Message: 
	'Common base class for Message' 
	MsgCount = 0 
	def __init__(self, name, ID): 
		self.name = name 
		self.ID = ID
		Message.MsgCount += 1 
	def displayCount(self): 
		print ("Total Message %d" % Message.MsgCount) 
	def displayMsg(self): 
		print ("Name : ", self.name, ", ID: ", self.ID)

 

이 부분들은 예전에 제가 만들었던 부분입니다. 물론, 주석 및 몇가지 부분들을 추가 하였습니다. 일단, MsgCount 라는 인스턴스에서 공유할 변수를 선언합니다. . 

 

그리고 __init__ 함수를 선언했습니다. 이 부분은 실제 클래스를 초기화 할때 진행되는 부분입니다. 위의 부분을 보면 클래스를 생성할 때 2개인 인자값(name, ID)를 받아 각 클래스 내부 변수를 선언하는 구조 입니다. self는 클래스 자신으로 실제로는 입력하지 않습니다. 

 

인스턴스 생성 및 속성 접근 

 

위의 예시를 바탕으로 인스턴스를 만들고 각 속성에 접근하는 예시를 한번 만들어 보고자 합니다. 

Msg1 = Message("CAN_Tx",517)
Msg2 = Message("CAN_Tx",517)
Msg1.displayMsg()
print(Message.MsgCount)

 

위의 결과를 실행해보면 다음과 같은 결과를 볼 수 있습니다. 

Name :  CAN_Tx , ID:  517
2

이밖에도 클래스의 속서에 접근하는 몇가지 기능들에 대해서 살펴 보겠습니다. 

 

   hasattr(인스턴스, 속성) - 명시된 속성이 존재하면 참이고, 없으면 거짓 판별

   getattr(인스턴스, 속성) - 명시된 속성의 값을 가져오는 기능 

   setattr(인스턴스, 속성, 값) - 명시된 속성의 값을 지정하는 기능 

   delattr(인스턴스, 속성) - 속성을 지우는 기능   

 

클래스 상속

다른 어떤 클래스의 구조를 기반으로 해서 다른 클래스를 만드는 것입니다. 즉 상속에서는 동일한 이름이 중복 되는 것들은 상속되지 않고 현재 클래스에 명시 되는 것을 사용합니다. 일단, 먼저 클래스 상속하는 방법에 대해서 살펴 보겠습니다.  

 

   class subClassName(SuperClass):

           <클래스 본체>

 

위를 부분을 바탕으로 클래스 상속하는 방법을 예시로 살펴보도록 하겠습니다. 

 

class Message:
    'Common base class for Message'
    MsgCount = 0
    def __init__(self, name, ID):
        self.name = name
        self.ID = ID
        Message.MsgCount += 1
    def displayCount(self):
        print("Msg")
    def displayMsg(self):
        print("Name Count")

class Signal(Message):
    SigCount = 0
    def __init__(self,name):
        self.name = name
        Signal.SigCount += 1
    def displaySig(self):
        print("Msg")
    def displaySignal(self):
        print("Name Count")

C = Signal("Name")
C.displayMsg()

 

Signal 이라는 class에서 Message를 상속받아서 그 틀을 바탕으로 사용할 수 있습니다. 따라서 C라는 인스턴스를 만들었고, Message에 생성된  class내의 함수를 사용할 수 있습니다. 하지만, __init__과 같이 중첩되는 부분에 대해서는 subclass즉 상속을 받는 쪽에 선언된( 위의 예시에서는 Signal) 클래스의 부분을 사용하게 됩니다. 위의 코드를 실행하면 다음과 같은 결과가 나옵니다. 

 

Name Count

 

오늘로, 간단하게 필요한 부분들에 대해서 한번 쭈욱 살펴 보았습니다. 다음부터는 실제 필요한 부분들에 대해서 직접적으로 코드 및 관련된 기능들에 대해서 포스팅 해보고자 합니다. 물론 12번의 포스팅으로 모든 부분에 대해서 다 공유하지는 못했습니다. 나머지 부분들에 대해서는 각 포스팅에서 조금씩 다루어보고 만약에 별도의 포스팅이 필요한 내용들에 대해서는 별도 포스팅을 진행하고자 합니다. 그래도 이정도 익혀 두시면 기본적인 작업할 때에 크게 문제 되지 않을 것이라고 생각합니다. 

반응형
Comments