[Python] 파이썬 클래스 심화#1

아직·2022년 6월 8일
0
post-thumbnail

1)

car1=Car('Ferrari',{'color':'white','horsepower':400,'price':8000})
car2=Car('bmw',{'color':'dark','horsepower':700,'price':4000})

print(car1._company==car2._company)
print(car1 is car2)

클래스 및 인스턴스 선언 이후 위 두 줄은 다른 의미를 지닌다.
위에는 값에 해당하는 Ferrari와 bmw의 비교이고, 아래는 id값의 비교이다.

2)

print(dir(car1))명령어로 확인하면 해당 오브젝트가 클래스를 상속한 상황에서 어떤 구성요소로 이루어져 있는지 '리스트 형태'로 확인할 수 있다. 값은 확인할 수 없음. 이 attribute에는 __init__, __str__ 뿐만 아니라 __init__ 아래로 정의한 _company, _details도 포함된다. 이 중 name space영역의 instance 값들 위주로 확인하고 싶을 때는 __dict__ attribute를 활용해서 print(car1.__dict__)범위를 좁혀줄 수 있다. '딕셔너리 형태'로 보여준다.

"어떤 클래스인지 보자" vs "어떤 인스턴스인지 보자"

3)

class Car():

    """
    Car class
    Author: Luke
    Date: 2022.05.30
    """


클래스 선언 시 주석 달기는 협업에서 특히 중요한데, print(Car.__doc__) 명령어로 확인할 수 있다. print(car1.__doc__)도 가능.

4)

def detail_info(self):
	print('Current ID :{}'.format(id(self)))
    print('Car Detail Info : {} {}'.format(self._company, self._details.get('price')))

선언 이후 car1.detail_info()했을 경우와 print(id(car1))를 비교. 'self' id를 찾는 method와 인스턴스를 할당한 '변수 car1에 담긴' id를 찾는 방법의 차이인데 결과는 같다. 클래스에 종속된 좁은 의미의 함수를 메소드라고 이용하는 게 좋을 것 같다.

car1에 명령하는 것과 직접 car1을 해체해보는 차이?

5)

self._company는 인스턴스 변수
__str__(self)는 인스턴스 method

6)

class Car():

    #클래스 변수
    car_count=0

    def ____init____(self, company, details):
        self._company=company
        self._details=details
        Car.car_count += 1

Car 클래스에 car_count변수만 0으로 초기화해주면 car1.car_count나 car2.car_count 모두 0의 값을 가지겠지만, __init__ method가 호출될 때마다 count가 1씩 증가하도록 정의해주었다. 그래서 car_count는 1*'변수의 갯수'의 값을 가진다.

클래스 변수는 모든 인스턴스가 공유한다. 반면 인스턴스는 self인자를 갖는 '내꺼'에 가깝다.

7)

print(car1.car_count)
print(Car.car_count)

둘이 같은 값을 갖는 경우는 __init__에서 self.car_count=10과 같은 형태로 정의해주지 않았기 때문이다. 정의된 값이 인스턴스 네임 스페이스에 없으므로 상위인 클래스 변수에서 car_count값을 찾게 된다. 따라서 동일한 이름의 인스턴스 변수와 클래스 변수를 각각 다른 영역(__init__ 전/후)에 생성할 수 있다.

    

0개의 댓글