객체 없이 그냥 변수를 생성
추가 요소를 만들 때는 숫자와 값만 변경하고 계속 증가시킴
스마트폰과 스마트폰 정보를 출력하려면 두 변수를 같이 프린트해야 함
`smartphone_1 = 'Iphone'
smartphone_information_1 = [
{'color' : 'White'},
{'price': 10000}
]
print(smartphone_1)
print(smartphone_information_1)`
딕셔너리의 Key는 중복 불가능한 문제가 존재
정렬 문제 => OrderedDict을 사용하면 해결
Key가 만약 없을 경우 예외 처리를 해야 함 => DefaultDict을 사용하면 해결
스마트폰, 스마트폰 정보를 출력할 경우엔 딕셔너리만 출력하면 됨
`smartphone_dicts = [
{'brand': 'Iphone', 'smartphone_information': {'color' : 'White', 'price': 10000}},
{'brand': 'Galaxy', 'smartphone_information': {'color' : 'Blue', 'price': 8000}},
]
print(smartphone_dicts)`
프로그래밍 언어에서 객체를 구분할 수 있는 공간
변수를 객체에 할당하면, 해당 객체는 딕셔너리 형태로 연결되서 네임스페이스에 저장됨
파이썬의 클래스는 새로운 타입(객체)을 정의하기 위해 사용되고, 모듈과 마찬가지로 하나의 네임스페이스를 가짐
globals()
를 사용하면 전역 네임스페이스를 확인할 수 있음
함수는 전역과 별개의 네임스페이스를 가짐
temp_variable = a print(globals())
__init__
: 클래스 인스턴스 생성시 초기화하며 실행되는 부분__dict__
을 사용__str__
매직 메소드가 구현되어 있지 않은 상태에서 인스턴스를 print하면 object가 나옴__repr__
: str과 비슷__dict__
__dict__
를 사용한 후, 특정 네임스페이스에 접근하면 됨__doc__
`class Smartphone:
"""
Smartphone class
"""
def init(self, brand, informations):
self._brand = brand
self._informations = informations
def __str__(self):
return f'str : {self._brand} - {self._informations}'
def __repr__(self):
return f'repr : {self._brand} - {self._informations}'
Smartphone1 = Smartphone('Iphone', {'color' : 'White', 'price': 10000})
Smartphone2 = Smartphone('Galaxy', {'color' : 'Black', 'price': 8000})
print(Smartphone1)
print(Smartphone1.dict)
print(Smartphone1._brand == Smartphone2._brand)
print(Smartphone1 is Smartphone2)
print(Smartphone.doc)`
__class__
는 사용된 클래스를 출력함`class Smartphone:
"""
Smartphone Class
"""
def __init__(self, brand, details):
self._brand = brand
self._infomations = infomations
def __str__(self):
return f'str : {self._brand} - {self._ infomations}'
def __repr__(self):
return f'repr : {self._brand} - {self._ infomations}'
def get_infomation(self):
print(f'Current Id : {id(self)}')
print(f'Smartphone Detail Info : {self._brand} {self._infomations.get("price")}')
Smartphone1 = Smartphone('Iphone', {'color': 'White', 'price': 10000})
Smartphone2 = Smartphone('Galaxy', {'color': 'Black', 'price': 8000})
Smartphone1.detail_info()
print(Smartphone1.__class__, Smartphone2.__class__)
# 부모는 같음
print(id(Smartphone1.__class__) == id(Smartphone2.__class__))`
Smartphone1.__dict__
를 출력하면 클래스 변수는 보이지 않음dir(Smartphone1)
를 출력할 때는 클래스 변수가 보임`class Smartphone:
"""
Smartphone Class
"""
# 클래스 변수
smartphone_count = 0
def __init__(self, brand, infomations):
self._brand = brand
self._infomations = infomations
Smartphone.smartphone_count += 1
def __str__(self):
return f'str : {self._brand} - {self._infomations}'
def __repr__(self):
return f'repr : {self._brand} - {self._infomations}'
def infomation(self):
print(f'Current Id : {id(self)}')
print(f'Smartphone Detail Info : {self._brand} {self._infomations.get('price'))}'
def __del__(self):
Smartphone.smartphone_count -= 1
Smartphone1 = Smartphone('Iphone', {'color' : 'White', 'price': 10000})
Smartphone2 = Smartphone('Galaxy', {'color' : 'Black', 'price': 8000})
print(Smartphone.dict)
print(Smartphone1.dict)
print(Smartphone2.dict)
print(dir(Smartphone1))
print(Smartphone1.smartphone_count)
print(Smartphone.smartphone_count)`
`class Smartphone:
"""
Smartphone Class
"""
Smartphone_count = 0
def __init__(self, brand, informations):
self._brand = brand
self._informations = informations
Smartphone.smartphone_count += 1
def __str__(self):
return f'str : {self._brand} - {self._informations}'
def __repr__(self):
return f'repr : {self._brand} - {self._informations}'
def detail_info(self):
print(f'Current Id : {id(self)}')
print(f'Smartphone Detail Info : {self._brand} {self._informations.get('price'))}'
def get_price(self):
return f'Before Smartphone Price -> brand : {self._brand}, price : {self._informations.get('price')}'
def get_price_culc(self):
return f'After Smartphone Price -> brand : {self._brand}, price : {self._informations.get('price') * Smartphone.price_per_raise}'
@classmethod
def raise_price(cls, per):
if per <= 1:
print('Please Enter 1 or More')
return
cls.price_per_raise = per
return 'Succeed! price increased.'
@staticmethod
def is_iphone(inst):
if inst._brand == 'Iphone':
return f'OK! This Smartphone is {inst._brand}.'
return 'Sorry. This Smartphone is not Iphone.'
Smartphone1 = Smartphone('Iphone', {'color' : 'White', 'price': 10000})
Smartphone2 = Smartphone('Galaxy', {'color' : 'Black', 'price': 8000})
print(Smartphone1)
print(Smartphone2)
Smartphone1.information()
Smartphone2.information()
print(Smartphone1.get_price())
print(Smartphone2.get_price())
Smartphone.price_per_raise = 1.2
print(Smartphone1.get_price_culc())
print(Smartphone2.get_price_culc())
Smartphone.raise_price(1.6)
print(Smartphone1.get_price_culc())
print(Smartphone2.get_price_culc())
def is_iphone(inst):
if inst._brand == 'Iphone':
return f'OK! This Smartphone is {inst._brand}.'
return 'Sorry. This Smartphone is not Iphone.'
print(is_iphone(Smartphone2))
print('Static : ', Smartphone.is_iphone(Smartphone1))
print('Static : ', Smartphone.is_iphone(Smartphone2))`
`class Smartphone:
def init(self, brand, price):
self._brand = brand
self._price = price
def __str__(self):
return f'str : {self._brand} - {self._price}'
class Galaxy(Smartphone):
def init(self, brand, price, country):
self._brand = brand
self._price = price
self._country = country
def __str__(self):
return f'str : {self.__class__.__name__} 스마트폰은 {self._brand}에서 출시되었고, {self._country}에서 생산되었습니다. 가격은 {self._price}입니다'
iphone = Smartphone('IPhone', 7000)
print(iphone)
galaxy = Galaxy('Galaxy', 5000, 'South Korea')
print(galaxy)`
`class Smartphone:
def init(self, brand, price):
self._brand = brand
self._price = price
def get_price(self):
return self._price
def set_price(self, price):
self._price = price`
`class Smartphone:
def init(self, brand, price):
self._brand = brand
self._price = price
@property
def price(self):
return self._price
@price.setter
def price(self, price):
print(f"변경 전 가격 : {self._price}")
self._price = price
print(f"변경 후 가격 : {self._price}")
Smartphone1 = Smartphone("Iphone", 1000)
Smartphone1.price = 10000`
`class Smartphone:
def init(self, brand, price):
self._brand = brand
self._price = price
@property
def price(self):
return self._price
@price.setter
def price(self, price):
if price < 0:
raise ValueError("Price below 0 is not possible")
print(f"변경 전 가격 : {self._price}")
self._price = price
print(f"변경 후 가격 : {self._price}")
Smartphone1 = Smartphone("Iphone", 1000)
Smartphone1.price = 10000
Smartphone1.price = -1000`
`class Smartphone:
def func1(cls):
raise NotImplementedError()
class Iphone(Smartphone):
pass
iphone = Iphone()
iphone.func1() # Error 발생`
@abc.abstractmethod
를 사용하는 방법`import abc
class Smartphone(metaclass=abc.ABCMeta):
@abc.abstractmethod
def func1(cls):
raise NotImplementedError()
class Iphone(Smartphone):
def func2(self):
pass
iphone = Iphone() # Error 발생`
obj.__dict__
으로 접근하는 경우__slots__
를 사용해 특정 속성에만 메모리를 할당하도록 함__slots__
를 사용해서 메모리 사용량이 얼마나 개선되는지 확인할 수 있음__slots__
없이 짠 코드`class Smartphone:
def init(self, brand, price):
self._brand = brand
self._price = price
self.set_up()
# 코드 생략
# set_up은 init시 실행하는 함수라고 생각`
__slots__
를 사용해 짠 코드`class Smartphone:
slots = ['_brand', '_price']
def __init__(self, brand, price):
self._brand = brand
self._price = price
self.set_up()
# 코드 생략
# set_up은 init시 실행하는 함수라고 생각`
객체 = 클래스이름()
객체.매서드()
shark = Monster()
shark.say()
class Monster:
def__init__(self,name):
self.name = name
self.age = age
->init(self,name)파라미터로 받은 neme을 사용하겠다라는 의미다.
def say(self):
print(f'나는 {self.name} {self.age}살임')
#shark = Monster("상어", 7)
#wolf = Monster("늑대", 3)
shark.say()
wolf.say()
1. Monster 클래스로부터 shark객체를 만들어내는데 그 안에 매개변수로 상어를 호출하겠다.
2. 이렇게 실행했을떄 제일 먼저 호출되는 것은 생성자다. -> __init__을 뜻한다.
3. def__init__(self,name): -> self에 shark가 들어간다.
self.name = name에 상어가 들어간다.
Monster
1. name 몬스터클래스의 속성이 된다.