# 클래스 재 선언
class Car():
"""
Car Class
"""
# 클래스 변수
car_count = 0
def __init__(self, company, details):
self._company = company # 인스턴스 변수
self._details = details
Car.car_count += 1 # 클래스 변수
def __str__(self):
return 'str : {} - {}'.format(self._company, self._details)
def __repr__(self):
return 'repr : {} - {}'.format(self._company, self._details)
def detail_info(self):
print('Current Id : {}'.format(id(self)))
print('Car Detail Info : {} {}'.format(self._company, self._details.get('price')))
def __del__(self):
Car.car_count -= 1
car1 = Car('Ferrari', {'color' : 'White', 'horsepower': 400, 'price': 8000})
car2 = Car('Bmw', {'color' : 'Black', 'horsepower': 270, 'price': 5000})
car3 = Car('Audi', {'color' : 'Silver', 'horsepower': 300, 'price': 6000})
# ID 확인
print(id(car1)) # <__main__.Car object at 0x0000018F8E69D320>
print(id(car2)) # <__main__.Car object at 0x0000018F8E69DE48>
print(id(car3)) # <__main__.Car object at 0x0000018F8E6A5828>
print(car1._company == car2._company) # 값을 비교, false
print(car1 is car2) # 주소값(ID값) 비교, false
# dir & __dict__ 확인, 내부 메소드, 내부 변수까지 보여줌. 모든 attr 을 다 보여줌. 결과는 리스트 형식
print(dir(car1)) # 내부 메소드, 내부 변수까지 보여줌. 모든 attr 을 다 보여줌. 결과는 리스트 형식
print(dir(car2))
print()
print(car1.__dict__) # 딕셔너리 형식으로 인스턴스 안의 값을 보여줌
print(car2.__dict__)
--------------------------------------
1716081252224
1716081252728
1716081285832
False
False
['__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_company', '_details', 'car_count', 'detail_info']
['__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_company', '_details', 'car_count', 'detail_info']
{'_company': 'Ferrari', '_details': {'color': 'White', 'horsepower': 400, 'price': 8000}}
{'_company': 'Bmw', '_details': {'color': 'Black', 'horsepower': 270, 'price': 5000}}
인스턴스 매소드 접근 방법
# Doctring
print(Car.__doc__)
print()
print('실행 - 인스턴스.메소드 or 클래스.메소드(인스턴스명)')
car1.detail_info()
car2.detail_info()
car3.detail_info()
Car.detail_info(car1)
Car.detail_info(car2)
print('비교')
print(car1.__class__, car2.__class__)
# 클래스 자체 아이디를 의미함. 그래서 모두 같음. 부모를 표시함
print(id(car1.__class__), id(car2.__class__), id(car3.__class__))
print(id(car1.__class__) == id(car3.__class__))
print('에러 - 인스턴스명 전달없이 클래스.메소드() 는 오류')
Car.detail_info() # 에러 발생
---------------------------------------------------------
Car Class
실행 - 인스턴스.메소드 또는 클래스.메소드(인스턴스명)
Current Id : 1716081252224
Car Detail Info : Ferrari 8000
Current Id : 1716081252728
Car Detail Info : Bmw 5000
Current Id : 1716081285832
Car Detail Info : Audi 6000
---------------------------------------------------------
---------------------------------------------------------
print('에러 - 인스턴스명 전달없이 클래스.메소드() 는 오류')
Car.detail_info() # 에러 발생
---------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-58-1e5ad9f100b5> in <module>
10
11 print('에러 - 인스턴스명 전달없이 클래스.메소드() 는 오류')
---> 12 Car.detail_info() # 에러 발생
13 Car.detail_info(car1)
14 Car.detail_info(car2)
TypeError: detail_info() missing 1 required positional argument: 'self'
클래스 ID 접근방법 및 확인방법
print('비교')
print(car1.__class__, car2.__class__)
# 클래스 자체 아이디를 의미함. 그래서 모두 같음. 부모를 표시함
print(id(car1.__class__), id(car2.__class__), id(car3.__class__))
print(id(car1.__class__) == id(car3.__class__))
---------------------------------------------------
비교
<class '__main__.Car'> <class '__main__.Car'>
1716036009720 1716036009720 1716036009720
True
인스턴스 변수 , 클래스 변수 접근
car1 = Car('Ferrari', {'color' : 'White', 'horsepower': 400, 'price': 8000})
car2 = Car('Bmw', {'color' : 'Black', 'horsepower': 270, 'price': 5000})
car3 = Car('Audi', {'color' : 'Silver', 'horsepower': 300, 'price': 6000})
# 인스턴스 변수
# 직접 접근
print(car1._company, car2._company)
print(car2._company, car3._company)
# 클래스 변수
# 접근
print(car1.car_count)
print(car2.car_count)
print(Car.car_count)
--------------------------------------------------
Ferrari Bmw
Bmw Audi
클래스 변수 접근
3
3
3
인스턴스 네임스페이스 없으면 상위에서 검색
즉, 동일한 이름으로 변수 생성 가능(인스턴스 검색 후 -> 상위(클래스 변수, 부모 클래스 변수))
# 공유 확인
print(Car.__dict__)
print(car1.__dict__)
print()
print(dir(car1)) # 클래스 변수 car_count 보임.
# car_count 감소
del car2
print(car1.car_count)
print(Car.car_count)
--------------------------------------------
{'__module__': '__main__', '__doc__': '\n Car Class\n Author : Kim\n Date : yyyy.mmdd\n ', 'car_count': 3, '__init__': <function Car.__init__ at 0x000001B02F21CD90>, '__str__': <function Car.__str__ at 0x000001B02F21CE18>, '__repr__': <function Car.__repr__ at 0x000001B02F21CEA0>, 'detail_info': <function Car.detail_info at 0x000001B02F21CF28>, '__del__': <function Car.__del__ at 0x000001B02F22F048>, '__dict__': <attribute '__dict__' of 'Car' objects>, '__weakref__': <attribute '__weakref__' of
'Car' objects>}
{'_company': 'Ferrari', '_details': {'color': 'White', 'horsepower': 400, 'price': 8000}}
['__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_company', '_details', 'car_count', 'detail_info']
2
2
'Python > Intermediate' 카테고리의 다른 글
[Python] NamedTuple (0) | 2021.05.21 |
---|---|
[Python] Magic Method(2) (0) | 2021.05.21 |
[Python] Magic Method(1) (0) | 2021.05.21 |
[Python] Class(3) - Class Method, Static Method (0) | 2021.05.21 |
[Python] Class(1) - Basic (0) | 2021.05.20 |