프로그래밍/파이썬🐍

(6)처음시작하는파이썬_[6장 객체와 클래스]

개발자 덕구🐾 2022. 1. 14. 17:07
728x90

클래스는 박스를 만드는 틀, 객체는 플라스틱 박스로 비유할 수 있다.

 

객체는 어제쓰나??

 

비슷한 행동(메서드)을 하지만 내부상태(속성)이 다른 개별 인스턴스가 필요할 때, 객체는 유용하다.

 

string은 'cat', 'duck'과 같은 문자열 객체를 만들도록 내장되어있는 클래이다.

이러한 커스텀 객체들을 생성하기 위해 class 키워드를 이용해 클래스를 정의한다. 

 

class person() :
    pass

someone = person()

 

 

person()은 person 클래스로부터 객체를 생성한 후 someone변수에 이 객체를 할당한다. 

 

 

파이썬 객체 초기화 메서드 __init__이 있다. 

이는 클래스의 정의로부터 객체를 초기화한다.

self는 객체 자신을 가리킨다.

 

class person() :
    def __init__(self, name) :
        self.name = name

hunter = person('Elmer Fudd')

name 매개변수에 문자열을 전달하여 person 클래스로부터 객체를 생성할 수 있다. 

__init__메서드는 클래스의 정의로부터 생성된 새로운 객체를 초기화하고, 어떤 인자를 전달받는다.

 

(모든 클래스에서 __init__메서드를 가질 필요는 없다.)

 

 

 


 

 

기존의 클래스에서 변경 추가를 하고싶다면??

클래스를 복붙하여 다른 클래스를 만들 수 있을것이다.  하지만 관리해햐할 코드가 더 많아지는 것으로 혼란스러워진다.

 

이를 해결해줄 방법이 상속이다.

 

필요한 것만 추가/변경하여 새로운 클래스를 정의한다.

이를 자식클래스 == 서브클래스 == 파생된 클래스라고 한다.

이는 부모클래스의 모든 것을 상속받는다.

 

 

 

6.4 메서드 오버라이드

 

class Car() :
    def exclaim(self):
        print("I'am a car")

class Yogu(Car):
    def exclaim(self):
        print("I'am a yogu")

make_car = Car()
make_yogu = Yogu()
make_car.exclaim()
make_yogu.exclaim()

 

exclaim 메서드를 오버라이드(재정의) 하였다. 

 

만일 자식클래스에서 exclaim을 오버라이딩 하지않는다면 자동으로 부모의 exclaim을 쓸 수 있다. 

또한 부모클래스에는 없는 메서드를 자식클래스에 추가해줄 수 있다.

 

 

6.6 부모에게 도움받는 super()

 

 

class Person() :
    def __init__(self, name) :
        self.name = name
class EmailPerson(Person) :
    def __init__(self,name,email) :
        super().__init__(name)
        self.email = email

bob = EmailPerson('Bob','Bpb12@naver.com')
print(bob.name)
print(bob.email)

 

super을 이용해 부모 클래스의 함수를 사용할 수 있다.

 

자식의 클래스가 자신의 방식으로 뭔가를 처리하지만 아직 부모 클래스로부터 뭔가를 필요로 할때 super()를 사용한다.

 

 

 

6.10 메서드 타입

 

인스턴스 메서드 : 메서드의 정의에서 첫번째 인자가 self 인 메서드

 

클래스 메서드 : 클래스 전체에 영향을 미치는 메서드

클래스 정의에서 함수에 @classmethod 데커레이터가 있다면 이것은 클래스 메서드이다.

 

첫번재 매개변수는 클래스 자신이다. 보통 cls라고 쓴다.

 

 

class A() :
    count = 0
    def __init__(self) :
        A.count+=1
    def exclaim(self) :
        print("I'am a A")
    @classmethod
    def kids(cls) :
        print("A has ", cls.count, "little object. ")
    
easy_a = A()
breezy_a = A()
wheezy_a = A()
A.kids()

 

6.12 특수메서드

b = 4+5 와 같이 4와 5가 정수객체이고 '+'를 통해 더하고 '='를 통해 결과를 얻는다.

 

이는 특수메서드를 이용해 만들 수 있다.

특수 메서드는 __(두개의 언더스코어)로 시작하고 끝난다.

 

문자열 객체를 비교하여 같은지 다른지를 반환하는 클래스를 특수메서드를 이용해 구현하겠다.

 

 

class word() :
    def __init__(self, text) :
        self.text = text
    def __eq__(self, word2) :
        return self.text.lower() == word2.text.lower()

a = word('Ha')
b = word('ha')
c = word('la')

print(a==b)
print(b==c)

 

 

이와 같은 특수메서드는 많이 존재한다.

 

반응형