8. 객체(2) - 맹글링, 세 가지 메소드 타입, 덕 타이핑

2016. 10. 27. 02:43Programming Languages/PYTHON

1)private 네임 맹글링

파이썬에는 특수한 형태의 변수 이름이 사용된다. __(언더스코어 두개)를 속성 이름 앞에 붙이면 클래스 정의 외부에서 그 속성을 볼 수 없게된다.


1
2
3
4
5
6
7
8
9
10
11
class Person():
    def __init__(self,name):
        self.__name=name
    @property
    def name(self):
        print('inside the getter')
        return self._name
    @name.setter
    def name(self, name):
        print('inside the setter')
        self.__name=name
cs


이렇게 정의된 Person 객체에서 directly 객체.__name을 불러내려고 하면 에러가 뜬다.

**물론 객체._Person__name 으로 name 속성값을 바로 불러올 수도 있다. 속성이 완벽하게 보호되지는 않지만, 네임 맹글링을 통해 클래스 내부 속성에 쉽게 접근할 수 없게 한다.




2)메소드 종류

클래스에서 만들어 낼 수 있는 메소드에는 세가지 타입이 있다.


1.

클래스의 정의에서 메서드의 첫 번째 인자가 self라면 이 메서드는 인스턴스 메소드이다.

한 클래스로 여러 객체를 생성하면 각각의 객체가 메소드의 인자(self)로 불리게된다.

예를 들어 __init__(self)의 경우, 같은 클래스라도 객체 별로 초기화 작업을 수행한다.


2.

인스턴스 메소드와 달리 클래스 메소드는 클래스 전체에 영향을 미친다. 

클래스의 정의에서 함수 위에 @classmethod 데커레이터를 써서 클래스 메소드를 정의할 수 있다.

클래스에 대한 어떤 변화는 모든 객체에 영향을 미치며, 이 메서드의 첫 번째 매개변수는 클래스 자신이다.

파이썬에서는 보통 cls로 표기한다 (class는 예약어로 사용할 수 없다!)


**클래스 내부에서 변수를 선언하면 객체를 만들때마다 선언되는게 아니라 클래스를 정의한 코드가 읽히는 딱 한 번만 생성되는 모양이다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Person():
    num=0
    def __init__(self):
        Person.num+=1
    @classmethod
    def print(cls):
        print("There are",Person.num,"people")
 
Jim=Person()
Jack=Person()
Losa=Person()
 
Person.print()
 
#There are 3 people
cs


3.

정적 메소드는 @staticmethod 데커레이터가 붙어있고, 첫번째 매개 변수로 self나 cls가 없다. 

이 메소드에 접근하기 위해서 객체를 생성할 필요가 없다!!


1
2
3
4
5
6
7
class test():
    @staticmethod
    def announce():
        print("This is TEST!")
 
test.announce()
#This is TEST!
cs



3)Duck typing

is_duck(obj)이라는 메소드에서 인수 obj에 객체를 받아 그 객체의 introduce()메소드를 호출한다고 하자.

is_duck 메소드는 introduce()라는 메소드를 가지고 있는 모든 객체를 인수로 사용할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
def is_duck(obj):
    print(obj.introduce())
 
class Duck():
    def __init__(self, name):
        self.name=name
    def introduce(self):
        return self.name+" is duck"
 
class Cat():
    def __init__(self, name):
        self.name=name
    def introduce(self):
        return self.name+" is cat"
 
class Dog():
    def __init__(self, name):
        self.name=name
    def introduce(self):
        return self.name+" is dog"
 
Jack=Dog("Jack")
Sally=Duck("Sally")
Lucy=Cat("Lucy")
 
is_duck(Jack)
#Jack is dog
 
is_duck(Sally)
#Sally is duck
 
is_duck(Lucy)
#Lucy is cat
cs



'Programming Languages > PYTHON' 카테고리의 다른 글

+) pip  (0) 2016.11.22
9. 파일 입출력  (0) 2016.11.18
7. 객체(1)-객체 생성하기, 상속  (0) 2016.10.25
6. 모듈, 패키지, 프로그램  (0) 2016.10.23
5. 클로져, 람다, 제너레이터, 예외처리  (0) 2016.10.17