In [1]:
# 6.2 예시
class Person():
pass
# 함수처럼 클래스 이름을 호출하여 클래스에서 객체를 생성할 수 있다.
someone = Person()
# Person()은 Person 클래스로부터 개별 객체를 생성하고, someone 변수에 이 객체를 할당한다.
In [4]:
class Person():
def __init__(self):
pass
In [10]:
# 3
class Person():
def __init__(self, name):
self.name = name
# name 매개 변수에 문자열을 전달하여 Person 클래스에서 객체를 생성할 수 있다.
In [13]:
hunter = Person('Elmer Fudd')
In [14]:
print(hunter.name)
In [15]:
class Car():
pass
class Yugo(Car):
pass
In [19]:
class Car():
def exclaim(self):
print("I'm a Car")
class Yugo(Car):
pass
In [20]:
# 클래스에서 객체를 만들고 exclaim 메서드를 호출한다.
give_me_a_car = Car()
give_me_a_yugo = Yugo()
give_me_a_car.exclaim()
In [22]:
give_me_a_yugo.exclaim()
In [4]:
class Car():
def exclaim(self):
print("I'I
def exclaim(self):
print("I'm a Yugo! Much like a Car, but more Yugo-ish")
In [5]:
# 두 클래스에서 각각 객체를 생성한다.
give_me_a_car = Car()
give_me_a_yugo = Yugo()
In [6]:
# 각 객체의 exclaim 메서드를 호출한다.
give_me_a_car.exclaim()
give_me_a_yugo.exclaim()
In [8]:
class Person():
def __init__(self, name):
self.name = name
class MDPerson(Person):
def __init__(self, name):
self.name = "Doctor " + name
class JDPerson(Person):
def __init__(self, name):
self.name = name + ", Esquire"
In [9]:
# 이 경우 __init__ 초기화 메서드는 부모 클래스의 Person과 같은 인자를 취하지만
# 객체의 인스턴트 내부에서는 다른 name 값을 저장한다.
person = Person('Fudd')
doctor = MDPerson('Fudd')
lawyer = JDPerson('Fudd')
print(person.name)
print(doctor.name)
print(lawyer.name)
In [10]:
class Car():
def exclaim(self):
print("I'm a car!")
class Yugo(Car):
def exclaim(self):
print("I'm a Yugo! Much like a car, but more yugo-ish")
def need_a_push(self):
print("A little help here?")
In [12]:
give_me_a_car = Car()
give_me_a_yugo = Yugo()
give_me_a_car.exclaim()
give_me_a_yugo.exclaim()
give_me_a_yugo.need_a_push()
In [15]:
class Person():
def __init__(self, name):
self.name = name
class EmailPerson(Person):
def __init__(self, name, email):
super().__init__(name)
self.email = email
# 자식 클래스에서 __init__() 메서드를 정의하면 부모 클래스의 __init__ 메서드 대체
# 더이상 자동으로 부모의 __init__ 메서드가 호출되지 않는다
In [16]:
# EamilPerson 객체를 만들어보자
bob = EmailPerson('Bob Frapples', 'bob@frapples.com')
In [18]:
# name, email 속성에 접근할 수 있다.
print(bob.name)
print(bob.email)
In [19]:
# 자식 클래스에서 왜 다음과 같이 정의하지 않았을까?
# class EmailPerson(Person):
# def __init__(self, name, email):
# self.name = name
# self.email = email
In [20]:
class Duck():
def __init__(self, input_name):
self.hidden_name = input_name
def get_name(self):
print('inside the getter')
return self.hidden_name
def set_name(self, input_name):
print('inside the setter')
self.hidden_name = input_name
name = property(get_name, set_name)
In [21]:
fowl = Duck('Howard')
fowl.name
Out[21]:
In [22]:
fowl.get_name()
Out[22]:
In [23]:
fowl.name = 'Daffy'
In [24]:
fowl.name
Out[24]:
In [25]:
fowl.set_name('Daffy')
In [26]:
fowl.name
Out[26]:
In [33]:
class Duck():
def __init__(self, input_name):
self.hidden_name = input_name
@property
def name(self):
print('inside the getter')
return self.hidden_name
@name.setter
def name(self, input_name):
print('inside the setter')
self.hidden_name = input_name
In [34]:
fowl = Duck('Howard')
fowl.name
Out[34]:
In [35]:
fowl.name = "Donald"
fowl.name
Out[35]:
In [36]:
class Circle():
def __init__(self, radius):
self.radius = radius
@property
def diameter(self):
return 2 * self.radius
In [38]:
c = Circle(5)
c.radius
Out[38]:
In [41]:
c.diameter
Out[41]:
In [42]:
c.radius = 7
c.diameter
Out[42]:
In [1]:
class Duck():
def __init__(self, input_name):
self.__name = input_name
@property
def name(self):
print('inside the getter')
return self.__name
@name.setter
def name(self, input_name):
print('inside the setter')
self.__name = input_name
In [2]:
fowl = Duck('Howard')
fowl.name
Out[2]:
In [3]:
fowl.name = 'Donald'
In [4]:
fowl.name
Out[4]:
In [6]:
fowl.__name
# name 속성은 private의 속성은 아니지만 외부 코드에서 발견할 수 없도롞
# 이름을 'mangling' 했다.
In [7]:
fowl._Duck__name
Out[7]:
In [8]:
class A():
count = 0
def __init__(self):
A.count += 1
def exclaim(self):
print("I'm an A!")
@classmethod
def kids(cls):
print("A has", cls.count, "little objects.")
In [11]:
easy_a = A()
breezy_a = A()
wheezy_a = A()
A.kids()
In [12]:
class Quote():
def __init__(self, person, words):
self.person = person
self.words = words
def who(self):
return self.person
def says(self):
return self.words + '.'
class QuestionQuote(Quote):
def says(self):
return self.words + '?'
class ExclamationQuote(Quote):
def says(self):
return self.words + '!'
In [13]:
hunter = Quote('Elmer Fudd', "i'm hunting wabbits")
print(hunter.who(), hunter.says())
In [14]:
hunted1 = QuestionQuote('Bugs Bunny', "What's up, doc")
print(hunted1.who(), hunted1.says())
In [15]:
hunted2 = ExclamationQuote('Daffy Duck', "It's rabbit season")
print(hunted2.who(), hunted2.says())
In [16]:
class BabblingBrook():
def who(self):
return 'Brook'
def says(self):
return 'Babble'
brook = BabblingBrook()
In [17]:
# 다양한 객체의 who(), says() 메서드를 실행해보자.
# brook 객체는 다른 객체와 전혀 관계가 없다. (그래서??)
def who_says(obj):
print(obj.who(), obj.says())
In [18]:
who_says(hunter)
In [19]:
who_says(hunted1)
In [20]:
who_says(brook)
In [21]:
# 이러한 행위를 "Duck typing" 이라고 부른다. (더 찾아보자)
In [22]:
class Word():
def __init__(self, text):
self.text = text
def equals(self, words):
return self.text.lower() == words.text.lower()
In [23]:
first = Word('ha')
second = Word('HA')
third = Word('eh')
In [24]:
first.equals(second)
Out[24]:
In [25]:
first.equals(third)
Out[25]:
In [36]:
class Word():
def __init__(self, text):
self.text = text
def __eq__(self, words):
return self.text.lower() == words.text.lower()
In [37]:
first = Word('ha')
second = Word('HA')
third = Word('eh')
In [38]:
first == second
Out[38]:
In [39]:
first == third
Out[39]:
In [51]:
class bill():
def __init__(self, description):
self.description = description
class tail():
def __init__(self, length):
self.length = length
class Duck():
def __init__(self, bill, tail):
self.bill = bill
self.tail = tail
def about(self):
print("This duck has a", self.bill.description, 'bill and a', \
self.tail.length, 'tail')
In [52]:
tail = tail('long')
bill = bill('wide orange')
duck = Duck(bill, tail)
duck.about()
In [53]:
from collections import namedtuple
Duck = namedtuple('Duck', 'bill tail')
duck = Duck('wide orange', 'long')
duck
Out[53]:
In [54]:
duck.bill
Out[54]:
In [55]:
duck.tail
Out[55]:
In [56]:
# 딕셔너리에서 네임드 튜플을 만들 수 있다.
parts = {
'bill': 'wide orange',
'tail': 'long'
}
duck2 = Duck(**parts)
duck2
Out[56]:
In [ ]:
'etc > introducing python: 처음 시작하는 파이썬' 카테고리의 다른 글
vim 작업 취소, undo, undo 되돌리기! (0) | 2017.03.12 |
---|---|
5장: 파이 포장하기- 모듈, 패키지, 프로그램 (0) | 2017.01.18 |
4장: 파이 크러스트- 코드 구조 (0) | 2017.01.13 |
3장: 파이 채우기; list, tuple, dictionary, set (리스트, 튜플, 딕셔너리, 셋) (0) | 2017.01.11 |
2장: 파이 재료;숫자, 문자열, 변수 (0) | 2017.01.11 |