2016. 10. 27. 02:43ㆍProgramming 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 |