Python 대상 프로 그래 밍 에 대한 지식 요약

머리말
만약 당신 이 이전에 대상 을 대상 으로 하 는 프로 그래 밍 언어 를 접 한 적 이 없다 면,당신 은 먼저 대상 을 대상 으로 하 는 언어의 기본 적 인 특징 을 이해 하고 머 릿 속 에 기본 적 인 대상 을 대상 으로 하 는 개념 을 형성 해 야 합 니 다.그러면 Python 의 대상 을 대상 으로 하 는 프로 그래 밍 을 더욱 쉽게 배 울 수 있 습 니 다.
다음은 파 이 썬 이 대상 을 대상 으로 프로 그래 밍 하 는 지식 에 대해 알 아 보 겠 습 니 다.
클래스 와 인 스 턴 스
클래스 는 대상 의 정의 이 고 인 스 턴 스 는'진정한 실물'로 클래스 에서 정의 하 는 대상 의 구체 적 인 정 보 를 저장 합 니 다.
클래스,속성 및 방법 명명 규범
유형 명 은 보통 대문자 로 시작한다.이것 은 표준 관례 로 클래스 를 식별 하 는 데 도움 을 줄 수 있다.특히 실례 화 과정 에서(때로는 함수 호출 처럼 보인다).또한 데이터 속성(변수 나 상수)은 데이터 값 의 이름 으로 들 리 고 방법 명 은 해당 대상 이나 값 의 행 위 를 지적 해 야 한다.
또 다른 표현 방식 은 데이터 값 은 명 사 를 이름 으로 하고 방법 은 술어(동사 플러스 대상)를 사용 해 야 한 다 는 것 이다.데이터 항목 은 조작의 대상 이 며,방법 은 프로그래머 가 대상 에서 어떤 조작 을 하려 고 하 는 지 밝 혀 야 한다.
정 의 된 클래스 에서 대체적으로 이러한 방침 에 따라 데이터 값 은'name','phone','email'과 같 고 행 위 는'updatePhone','updateEmail'과 같다.이것 이 바로 흔히 말 하 는'혼합 기법(mixed Case)'이나'낙타 기법(camelCase)'이다.Python 규범 은 낙타 표기 법의 밑줄 친 방식 을 추천 합 니 다.예 를 들 어"update"phone”,“update_email”。클래스 도'AddrBookEntry','RepairShop'등 이 좋 은 이름 입 니 다.

class AddrBookEntry(object):

 def __init__(self, name, phone, email):
 self.name = name
 self.phone = phone
 self.email = email

 def update_phone(self, phone):
 self.phone = phone

 def update_email(self. email):
 self.email = email
신식 류 와 구식 류
신식 류 와 고전 류 성명 의 가장 큰 차이 점 은 모든 신식 류 가 적어도 하나의 부 류 를 계승 해 야 한 다 는 것 이다.계승 가능 한 클래스 가 없 으 면 object 클래스 를 계승 할 수 있 습 니 다.object 는'모든 종류의 어머니'로 모든 계승 구조의 최상 위 에 위치 합 니 다.직접적 이거 나 간접 적 인 하위 클래스 가 대상 을 만 들 지 않 았 다 면 고전 클래스 를 정의 했다.즉,부모 클래스 를 지정 하지 않 았 거나 하위 클래스 의 기본 클래스 가 부모 클래스 가 없 으 면 고전 클래스 를 만 들 었 습 니 다.
Python 3 에서 정의 하 는 클래스 는 기본적으로 신식 클래스 이 고 Python 2 에서 신식 클래스 를 정의 하려 면 object 를 계승 하거나 신식 클래스 를 계승 해 야 합 니 다.
self 변수
클래스 의 방법 은 일반적인 함수 와 특별한 차이 만 있 습 니 다.즉,첫 번 째 매개 변수 이름 이 있어 야 합 니 다.그러나 이 방법 을 호출 할 때 이 매개 변수 에 값 을 부여 할 필요 가 없습니다.Python 은 이 값 을 제공 합 니 다.이 특별한 변 수 는 대상 자 체 를 가리 키 며,관례 에 따라 이름 은 self 입 니 다.이 매개 변수 에 이름 을 줄 수 있 지만 self 라 는 이름 을 사용 하 는 것 을 강력 히 권장 합 니 다.다른 이름 은 사용 에 찬성 하지 않 습 니 다.
__init__() 방법.__init__()유형 구조 기 와 유사 하지만 사실은 구조 기 가 아니다.Python 이 인 스 턴 스 를 만 든 후에 실례 화 과정 에서 호출__init__() 방법 을 사용 합 니 다.하나의 클래스 가 실례 화 될 때 추가 행 위 를 정의 할 수 있 습 니 다.예 를 들 어 초기 값 을 설정 하거나 초기 진단 코드 를 실행 할 수 있 습 니 다.이것 은 인 스 턴 스 가 생 성 된 후에 이 인 스 턴 스 로 되 돌아 가기 전에 특정한 작업 이나 설정 을 수행 하 는 것 입 니 다.
귀속 및 비 귀속 방법
Python 에서 클래스 에 접근 하 는 방법 은 인 스 턴 스 를 통 해 클래스 를 통 해 직접 접근 할 수 있 습 니 다.그러나 Python 은 인 스 턴 스 가 없 으 면 방법 이 호출 될 수 없다 고 엄 격 히 요구 합 니 다.이러한 제한 은 Python 이 설명 한 바 인 딩 개념(binding)입 니 다.이 방법 은 바 인 딩(인 스 턴 스)해 야 직접 호출 될 수 있 습 니 다.비 귀속 방법 은 호출 될 수 있 지만,실례 대상 은 반드시 명확 하 게 제시 해야만 호출 성공 을 확보 할 수 있다.그러나 바 인 딩 여부 와 상 관 없 이 방법 은 그 가 있 는 클래스 의 고유 속성 입 니 다.거의 인 스 턴 스 를 통 해 호출 되 더 라 도.Python 에서 의 클래스 방법 도 하나의 대상 이다.쉽게 이해 할 수 있 는 것 은 클래스 를 통 해 직접 방문 하 는 방법 을'연결 되 지 않 은 방법'이 라 고 부 르 고 인 스 턴 스 를 통 해 방문 하 는 방법 을'연결 하 는 방법'이 라 고 부 르 는 것 이다.
1.귀속 되 지 않 은 클래스 방법:self 없 음
클래스 참조 방법 을 통 해 연결 되 지 않 은 방법 대상 을 되 돌려 줍 니 다.그것 을 호출 하려 면 첫 번 째 매개 변수 로 인 스 턴 스 를 표시 해 야 합 니 다.
2.바 인 딩 된 인 스 턴 스 방법:self 가 있 습 니 다.
인 스 턴 스 접근 방법 을 통 해 바 인 딩 방법 대상 을 되 돌려 줍 니 다.Python 은 자동 으로 방법 에 인 스 턴 스 를 연결 하기 때문에 우리 가 그것 을 호출 할 때 인 스 턴 스 인 자 를 하나 더 보 내지 않 아 도 됩 니 다.
예시:

class Test:
 def func(self, message):
 print message

object1 = Test()
x = object1.func
x("      ,      ")

t = Test.func
t(object1, "       ,        ")
# t("       ,        ") #      
클래스 속성 과 인 스 턴 스 속성
클래스 속성 은 클래스 와 관련 된 데이터 값 일 뿐 인 스 턴 스 속성 과 달리 클래스 속성 은 인 스 턴 스 와 무관 합 니 다.이 값 들 은 정적 구성원 처럼 인용 되 며,여러 번 의 실례 화 에서 클래스 를 호출 하 더 라 도 값 은 변 하지 않 습 니 다.어쨌든 정적 구성원 들 은 인 스 턴 스 로 인해 값 을 바 꾸 지 않 습 니 다.인 스 턴 스 에서 값 을 바 꾸 지 않 는 한.인 스 턴 스 속성 과 클래스 속성 을 비교 하면 자동 변수 와 정적 변수 와 유사 하지만 이것 은 추상 적 인 유추 일 뿐이다.자동 변수 와 정적 변수 에 대해 잘 모 르 는 상황 에서 이런 것들 을 깊이 연구 하지 마 세 요.
클래스 와 인 스 턴 스 는 모두 이름 공간 입 니 다.클래스 는 클래스 속성의 이름 공간 이 고 인 스 턴 스 는 인 스 턴 스 속성 입 니 다.
클래스 로 클래스 속성 에 접근 할 수 있 습 니 다.인 스 턴 스 가 같은 이름 의 속성 이 없 으 면 인 스 턴 스 로 접근 할 수 있 습 니 다.
민영화
Python 은 개인 적 인 방식 을 직접 지원 하지 않 고 프로그래머 스스로 외부 에서 특성 을 수정 할 시 기 를 파악 해 야 합 니 다.
방법 이나 특성 을 사유 로 바 꾸 기 위해 서 는 이름 앞 에 더 블 밑줄 을 그 으 면 됩 니 다.더 블 밑줄 긋 기시작 속성 이 실 행 될 때'혼동'되 기 때문에 직접 접근 하 는 것 은 허용 되 지 않 습 니 다.
실제로 Python 에서 두 밑줄 을 그 은 속성 이나 방법 은 진정한 의미 의 개인 이 아니 라 접근 할 수 있 습 니 다.클래스 의 내부 정의 에서 두 밑줄 로 시작 하 는 모든 이름 은'번역'되 어 앞 에 단일 밑줄 과 클래스 이름 을 추가 하 는 형식 입 니 다.

>>> class TestObj(object):
... __war = "world"
... 
... def __init__(self):
...  self.__har = "hello"
...  
... def __foo(self):
...  print(self.__har + self.__war)
...  
... 
... 
>>> t = TestObj()
>>> dir(t)
['_TestObj__foo', '_TestObj__har', '_TestObj__war', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getat
tribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__
', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>> t.__war
Traceback (most recent call last):
 File "<input>", line 1, in <module>
 t.__war
AttributeError: 'TestObj' object has no attribute '__war'
>>> t.__har
Traceback (most recent call last):
 File "<input>", line 1, in <module>
 t.__har
AttributeError: 'TestObj' object has no attribute '__har'
>>> t.foo()
Traceback (most recent call last):
 File "<input>", line 1, in <module>
 t.foo()
AttributeError: 'TestObj' object has no attribute 'foo'
>>> t._TestObj__war
'world'
>>> t._TestObj__har
'hello'
>>> t._TestObj__foo()
helloworld
__slots__ 클래스 속성
정상 적 인 상황 에서 우리 가 class 를 정의 하고 class 의 인 스 턴 스 를 만 든 후에 우 리 는 이 인 스 턴 스 에 모든 속성 과 방법 을 연결 할 수 있 습 니 다.이것 이 바로 동적 언어의 유연성 입 니 다.Python 에 서 는 기본적으로 사전 으로 인 스 턴 스 의 속성 을 저장 합 니 다.
예시:

>>> class A():
... pass
... 
>>> a = A()
>>> a.name = "huoty"
>>> a.age = 25
>>> print a.name
huoty
>>> print a.age
25
>>> a.__dict__
{'age': 25, 'name': 'huoty'}
사전 은 인 스 턴 스 의"심장"에 있 습 니 다.4567914)속성 은 모든 인 스 턴 스 속성 을 추적 합 니 다.예 를 들 어 인 스 턴 스 인 스 턴 스 가 있 습 니 다.속성 foo 가 있 습 니 다. __dict__를 사용 하여 방문 하 는 것 은 사용inst.foo 과 일치 합 니 다.
사전 은 많은 메모 리 를 차지 합 니 다.속성 이 적은 클래스 가 있 지만 인 스 턴 스 가 많다 면 바로 이런 상황 입 니 다.메모리 상의 고려 를 위해inst.__dict__['foo'] 속성 으로 대체 할 수 있 습 니 다__slots__.
,__dict__ 신식 류 의 특성 입 니 다.기본적으로 __slots__ 는 하나의 변수 로 하나의 서열 대상 으로 구성 되 고 모든 합 법 적 인 표지 로 구 성 된 실례 속성의 집합 으로 표시 된다.그것 은 목록,원 그룹 또는 교체 가능 한 대상 일 수 있 습 니 다.표지 인 스 턴 스 가 가 질 수 있 는 유일한 속성 을 가 진 간단 한 문자열 일 수도 있 습 니 다.이름 이 없 는__slots__ 이름 을 만 들 려 는 인 스 턴 스 속성 은 AttributeError 이상 을 초래 합 니 다.

>>> class SlotedClass(object):
... __slots__ = ("foo", "bar")
... 
... 
>>> c = SlotedClass()
>>> c.foo = 42
>>> c.bar = "hello"
>>> c.goo = "don't think so"
Traceback (most recent call last):
 File "&lt;input>", line 1, in &lt;module>
AttributeError: 'SlotedClass' object has no attribute 'goo'
이런 특성의 주요 목적 은 메모 리 를 절약 하 는 것 이다.그 부작용 은 특정한 유형의'안전'으로 사용자 가 원 하 는 대로 인 스 턴 스 속성 을 증가 하 는 것 을 방지 할 수 있다.__slots__ 속성 을 가 진 클래스 정 의 는 존재 하지 않 습 니 다__slots__ .
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

좋은 웹페이지 즐겨찾기