Q1.
아무 내용이 없는 Thing 클래스를 만들어서 출력한다.
이 클래스의 example 객체를 생성해서 출력한다.
이때 두 출력값은 같은가?
A.
class Thing():
pass
example = Thing()
print(type(example)) # <class '__main__.Thing'>
Q2.
Thing2 클래스를 만들고 이 클래스의 letters 속성에 값 'abc'를 할당한 후
letters를 출력해보자.
A.
class Thing2():
letters = 'abc'
name = Thing2().letters
print(name) # abc
Q3.
Thing3 클래스를 만들다. 이번에는 인스턴스(객체)의 letters 속성에 값 'xyz'를 할당한 후 letters를 출력한다.
letters를 출력하기 위해 객체를 생성해야 하는가?
A. 파이썬에서는 클래스 내부에 속성이 없더라도 인스턴스(객체)에서 임의로 넣을 수 있다.
class Thing3():
pass
example = Thing3()
example.letters= 'xyz'
print(example.letters) # xyz
Q4.
name, symbol, number 인스턴스 속성을 가진 Element 클래스를 만들어보자.
이 클래스에서 'Hydrogen', 'H', 1 값을 가진 객체를 생성한다.
A.
class Element:
def __init__(self, name, symbol, number):
self.name = name
self.symbol = symbol
self.number = number
example = Element('Hydrogen', 'H', 1)
print(example.name) # Hydrogen
print(example.symbol) # H
print(example.number) # 1
Q5.
'name' : 'Hydrogen', 'symbol' : 'H', 'number' : 1과 같이 키와 값으로 이루어진 el_dict 딕셔너리를 만들어보자.
그리고 el_dict 딕셔너리로부터 Element 클래스의 hydrogen 객체를 생성한다.
A. 위의 방식에서 대조하는 것과, 딕셔너리 unpacking을 활용하는 것도 있다.
class Element:
def __init__(self, name, symbol, number):
self.name = name
self.symbol = symbol
self.number = number
el_dict = {
'name' : 'Hydrogen',
'symbol' : 'H',
'number' : 1
}
example = Element(**el_dict) # 딕셔너리 unpacking을 사용
print(example.name) # Hydrogen
print(example.symbol) # H
print(example.number) # 1
Q6.
Element 클래스에서 객체의 속성(name, symbol, number)값을 출력하는 dump() 메서드를 정의한다.
이 클래스의 hydrogen 객체를 생성하고, dump() 메서드로 이 속성을 출력한다.
A.
class Element:
def __init__(self, name, symbol, number):
self.name = name
self.symbol = symbol
self.number = number
def dump(self):
print(f"Element(Name: {self.name}, Symbol: {self.symbol}, Number: {self.number})")
el_dict = {'name': 'Hydrogen', 'symbol': 'H', 'number': 1}
hydrogen = Element(**el_dict) # 딕셔너리 unpacking을 사용
hydrogen.dump() # Element(Name: Hydrogen, Symbol: H, Number: 1)
Q7.
print(hydrogen)을 호출한다. Element 클래스의 정의에서 dump 메서드를 __str__() 메서드로 바뀌서
새로운 hydrogen 객체를 생성한다.
그리고 print(hydrogen)을 다시 호출한다.
A. __str__메서드의 경우 객제를 문자열로 표현할 경우 호출되는 매직 메서드이다.
수정전 문자열 호출시
class Element:
def __init__(self, name, symbol, number):
self.name = name
self.symbol = symbol
self.number = number
def dump(self):
print(f"Element(Name: {self.name}, Symbol: {self.symbol}, Number: {self.number})")
el_dict = {'name': 'Hydrogen', 'symbol': 'H', 'number': 1}
hydrogen = Element(**el_dict) # 딕셔너리 unpacking을 사용
print(hydrogen) # <__main__.Element object at 0x777bbd19a620>
수정 후 문자열 호출시
class Element:
def __init__(self, name, symbol, number):
self.name = name
self.symbol = symbol
self.number = number
def __str__(self):
return f"Element(Name: {self.name}, Symbol: {self.symbol}, Number: {self.number})"
el_dict = {'name': 'Hydrogen', 'symbol': 'H', 'number': 1}
hydrogen = Element(**el_dict) # 딕셔너리 unpacking을 사용
print(hydrogen) # Element(Name: Hydrogen, Symbol: H, Number: 1)
Q8.
Element 클래스를 수정해서 name, symbol, number의 속성을 private로 만든다.
각 속성값을 반환하기 위해 getter 프로퍼티를 정의한다.
A. __를 변수 앞에 지정하게 되면 클래스 외부에서 호출할 수 없게 할 수 있다.(private)
class Element:
def __init__(self, name, symbol, number):
self.__name = name
self.__symbol = symbol
self.__number = number
@property
def name(self):
return self.__name
@name.setter
def name(self, name):
self.__name = name
@property
def symbol(self):
return self.__symbol
@symbol.setter
def symbol(self, symbol):
self.__symbol = symbol
@property
def number(self):
return self.__number
@number.setter
def number(self, number):
self.__number = number
Q9.
세 클래스 Bear, Rabbit, Octothorpe를 정의한다.
각 클래스에 eats() 메서드를 정의 해보자.
각 메서드는 'berries' (Bear), 'clover' (Rabbit), 'campers' (Octothorpe)를 반환한다.
각 클래스의 객체를 생성하고, eats() 메서드의 반환값을 출력한다.
A.
class animals():
def __init__(self, name, food):
self.__name = name
self.__food = food
def eats(self):
return f"{self.__food} ({self.__name})"
class Bear(animals):
def __init__(self):
super().__init__("Bear", "berries")
class Rabbit(animals):
def __init__(self):
super().__init__("Rabbit", "clover")
class Octothorpe(animals):
def __init__(self):
super().__init__("Octothorpe", "campers")
bear = Bear()
rabbit = Rabbit()
octothorpe = Octothorpe()
print(bear.eats()) # berries (Bear)
print(rabbit.eats()) # clover (Rabbit)
print(octothorpe.eats()) # campers (Octothorpe)
Q10.
Laser, Claw, SmartPhone 클래스를 정의한다.
각 클래스는 does() 메서드를 갖고 있다.
각 메서드는 'disintegrate' (Laser), 'crush' (Claw) 또는 'ring' (Smart Phone)을 반환한다.
그리고 각 인스턴스(객체)를 갖는 Robot 클래스를 정의한다.
Robot 클래스의 객체가 갖고 있는 내용을 출력하는 does() 메서드를 정의한다.
A.
class Laser:
def does(self):
return "disintegrate"
class Claw:
def does(self):
return "crush"
class SmartPhone:
def does(self):
return "ring"
class Robot:
def __init__(self):
self.laser = Laser()
self.claw = Claw()
self.smartphone = SmartPhone()
def does(self):
return (f"Laser: {self.laser.does()}, "
f"Claw: {self.claw.does()}, "
f"Smart Phone: {self.smartphone.does()}")
robot = Robot()
print(robot.does()) # Laser: disintegrate, Claw: crush, Smart Phone: ring