Python class

43
Python Study Of Landvibe made by 김건희 오늘의 주제 Class의 이해

Transcript of Python class

Python

Study Of Landvibe

made by 김건희

오늘의주제Class의이해

Outline

1. Understanding Class

2. Initialization Function : __init__()

3. Class Variable & Instance Variable

4. Data Hiding & Name Mangling

5. Getter, Setter and @property

6. Inheritance & Mixin & Polymorphism

Understanding Class

함수 : 특정행위에대해기술한소스코드

클래스 : 특정행위와상태를담을수있는객체를생성하기위한명세서

모듈 : 함수, 클래스등을포함하여독립적인파일(.py)로저장하여언제든지호출하여재사할수있는공통소스코드들의집합

Don’t Repeat Yourself!

>>> “같은소스를반복해서작성하지말라”

소스 재사용

Understanding Class

함수 : 특정행위에대해기술한소스코드

클래스 : 특정행위와상태를담을수있는객체를생성하기위한명세서

모듈 : 함수, 클래스등을포함하여독립적인파일(.py)로저장하여언제든지호출하여재사할수있는공통소스코드들의집합

Don’t Repeat Yourself!

>>> “같은소스를반복해서작성하지말라”

소스 재사용

Understanding Class

특정행위와상태를담을수있는객체를생성하기위한명세서

1. 클래스의 정의

Understanding Class

특정행위와상태를담을수있는객체를생성하기위한명세서

1. 클래스의 정의

특정행위 : Method

Understanding Class

특정상태 : Attribute

특정행위와상태를담을수있는객체를생성하기위한명세서

1. 클래스의 정의

특정행위 : Method

Understanding Class

특정상태 : Attribute

특정행위와상태를담을수있는객체를생성하기위한명세서

1. 클래스의 정의

특정행위 : Method

명세서 : Class Name

클래스의 3요소 : 클래스명, 속성, 메소드

Understanding Class

Bom은 23살이다Bom은인하대학교를다닌다Bom은간수치가 40이다Bom은술을마시면간수치가 50증가한다Bom은휴식을취하면간수치가 50떨어진다

1. 클래스의 정의

속성과행위로나눈다

속성 : Bom, 23살, 인하대재학, 간수치40

행위 : 술마시면간수치 +50, 휴식하면간수치-50

Understanding Class

1. 클래스의 정의

class Bom:

name = ‘Bom’

age = 23

univ = “Inha”

liver_state = 40

def drink_alcohol(self):

liver += 50

print( name, “이가술을마십니다”)

def rest(self):

liver -= 50

print( name, “이가휴식을취합니다”)

Bom은 23살이다Bom은인하대학교를다닌다Bom은간수치가 40이다Bom은술을마시면간수치가 50증가한다Bom은휴식을취하면간수치가 50떨어진다

클래스 내부함수의첫 인자는 self

Understanding Class

2. 클래스의 사용

bom = Bom()

print(bom.name + ‘은 ’ + bom.univ + ‘대학교에다닙니다’ )

bom.drink_alcohol()

print(bom.liver)

bom.rest()

print(bom.liver)

변수 = 클래스이름()

변수.속성이름변수.함수이름()

Bom은 Inha대학교에다닙니다Bom이가술을마십니다90

Bom이가휴식을취합니다40

초기화 함수 내부에 선언된 변수에는 self 키

워드가 붙는다

초기화함수 : __init__()

1. __init___()

class Bom:

def __init__(self, name, age, univ)

print(‘초기화함수시작’)

self.name = name

self.age = age

self.univ = univ

self.liver_state = 40

def drink_alcohol(self):

liver += 50

print( name, “이가술을마십니다”)

def rest(self):

liver -= 50

print( name, “이가휴식을취합니다”)

C++ 과 Java의 생성자함수와같은역할클래스가생성된직후에바로실행된다 클래스 내부함수의

첫 인자는 self

초기화함수 : __init__()

2. __init___() 사용

yang= Bom(‘양욱’, 20, ’인하’)

print(yang.name + ‘은 ’ + bom.univ + ‘대학교에다닙니다’ )

yang.liver = 50

print(yang.liver)

yang.rest()

print(yang.liver)

초기화함수시작양욱은인하대학교에다닙니다90

Bom이가휴식을취합니다140

초기화함수 : __init__()

3. 주의사항

class Bom:

self.univ = ‘연세’

def __init__(self, name, age)

print(‘초기화함수시작’)

self.name = name

self.age = age

self.liver_state=40

__init__함수밖에 self.변수이름선언안됨

class Bom:

def __init__(self, name)

self.name = name

self.age

b = Bom(“bom”)

print(b.age)

초기화되지않은변수를참조하면에러

클래스변수&인스턴스변수

1. self

class Bom:

self.univ = ‘연세’

def __init__(self, name, age, univ)

print(‘초기화함수시작’)

self.name = name

self.age = age

self.liver_state=40

C++과 Java의 this 키워드와같은역할지금현재속해있는클래스를참조한다클래스내부함수의첫인자는모두 self

class Bom:

def __init__(self, name, age, univ)

print(‘초기화함수시작’)

self.name = name

self.age = age

여기서 self는 모두Bom클래스의 주소를

참조한다

초기화함수밖에사용하면안되는이유!?

함수의 인자 self를사용한것!

클래스변수&인스턴스변수

2. 클래스 객체와 인스턴스 객체의 namespace

class Bom:

name = ‘Bomin’

def __init__(self)

self.age = 23

>>> b1 = Bom()

>>> b1.name = ‘JumBomin

name=‘JumBomin’

b1(인스턴스)name=‘Bomin’

Bom(클래스)

클래스변수&인스턴스변수

2. 클래스 객체와 인스턴스 객체의 namespace

>>> b1 = Bom()

>>> b1.name = ‘JumBomin’

>>> b2 = Bom()

>>> b1.name

JumBomin

>>> b2.name

Bomin

>>> Bom

Bomin

name=‘JumBomin’

b1(인스턴스)

name=‘Bomin’

Bom(클래스)

b2(인스턴스)

데이터은닉&이름장식

1. 데이터 은닉 (Data Hiding)클래스의내부변수를외부에서접근하지못하게숨기는것변수의신뢰도를높혀준다캡슐화 (Encapsulation)라고부르기도함

어떻게접근을못하게할까?

class Bom:

name = ‘Bomin’

>>> b1 = Bom()

>>> b1.name

Bomin

데이터은닉&이름장식

2. 이름 장식 (Name Mangling)

변수앞에 __(언더스코어두개)를붙혀클래스외부에서접근하지못하게한다

어떻게접근을못하게할까?

class Bom:

__name = ‘Bomin’

>>> b1 = Bom()

>>> b1.name

AttributeError: type object ‘Bom’ has no atrribute ‘name’

>>> b1.__name

AttributeError: type object ‘Bom’ has no atrribute ‘__name’

데이터은닉&이름장식

dir(classname) 함수 : classname내부의 namepace출력

‘_클래스명__변수명 ‘ 으로 namespace가 바뀜>>> name, __name 접근불가능!

데이터은닉&이름장식

2. 이름 장식 (Name Mangling)

_클래스명__변수명으로 접근가능

class Bom:

__name = ‘Bomin’

>>> b1 = Bom()

>>> b1._Bom__name

Bomin

데이터은닉&이름장식

2. 이름 장식 (Name Mangling)

_클래스명__변수명으로 접근가능

class Bom:

__name = ‘Bomin’

>>> b1 = Bom()

>>> b1._Bom__name

Bomin

그럼 데이터 은닉이안되는거 아니에요?

데이터은닉&이름장식

2. 이름 장식 (Name Mangling)

_클래스명__변수명으로 접근가능

class Bom:

__name = ‘Bomin’

>>> b1 = Bom()

>>> b1._Bom__name

Bomin

파이썬은 Java나 C++과다르게데이터은닉이약한언어입니다.

>>> dir()로 namespace를 확인할수도있고>>> _클래스명_변수명 으로접근도가능

@Property

1. Getter, Setter

데이터은닉, 캡슐화를위해서 C++, Java에서 사용하는디자인패턴

파이썬으로바꿔볼까요?

@Property

2. Property 클래스 활용

좀복잡한데… 다른방법없나요?

@Property

3. @Property 활용

함수 이름이 property attribute와 fget으로 설정

@Property

근데 이거 왜쓴다고 했죠?

데이터은닉, 캡슐화

@Property

어차피 은닉 안되는데왜 쓰는거에요?

파이썬은 Java나 C++과다르게데이터은닉이약한언어입니다.

>>> dir()로 namespace를 확인할수도있고>>> _클래스명_변수명 으로접근도가능

@Property

음…사실 잘 안써요..

@Property

4. 악의적인 입력 예방 (은근 중요하긴합니다)

입력되는 값의 범위를 정할수 있다

상속

1. 상속이란?

Base Class

Derived Class

Base Class : 부모클래스, 물려줄속성과메소드정의Derived Class : 자식클래스, 부모로부터속성과메소드물려받음

클래스마다동일한코드작성되는것방지부모에공통된속성을두어코드유지보수용이하게함

상속

1. 예제

상속

2. 속성확인, 부모클래스 확인

__dict__ : 인스턴스의속성을사전객체로관리__base__ : 클래스의부모클래스출력issubclass( 자식클래스, 부모클래스 ) : 두클래스의상속관계확인

상속

3. 부모 클래스의 생성자 호출

부모클래스이름.__init__(self, var…)

super(자식클래스이름, self).__init__(var…)

Developer

PythonDeveloper JavaDeveloper

CPPDeveloper

상속

4. 메소드 재정의 ( Method Overriding )

부모클래스의함수를자식클래스에서재정의해서사용하는것부모클래스의함수와자식클래스의함수의이름만같으면됩니다!

메소드의재정의로다형성구현

Developercoding()

PythonDevelopercoding()

JavaDevelopercoding()

CPPDevelopercoding()

상속

3,4 예제

상속

5. 다중 상속 & Mixin 클래스

2개이상의클래스를상속파이썬에서는다중상속이가능! ( Java는 다중상속허용x )

Mixin 클래스 : 속성없이메소드만정의되어있는클래스

Human

WebDeveloper

DeveloperMixin

상속

5. 예제

__class__(instance) : instance의 class 타입확인

상속

6. 다중 상속과 부모클래스

A

D

B C

부모클래스이름.__init__(self, var…)

super(자식클래스이름, self).__init__(var…)

상속

6. 다중 상속과 부모클래스

클래스 A의 생성자가두번호출되는문제발생!!!

상속

6. 다중 상속과 부모클래스

A

D

B C

부모클래스이름.__init__(self, var…)

super(자식클래스이름, self).__init__(var…)

상속

6. 다중 상속과 부모클래스

A 클래스생성자한번호출

과제

이번주는과제가없어요 ^_^