Python 대상 프로 그래 밍 에 대한 지식 요약
8432 단어 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 "<input>", line 1, in <module>
AttributeError: 'SlotedClass' object has no attribute 'goo'
이런 특성의 주요 목적 은 메모 리 를 절약 하 는 것 이다.그 부작용 은 특정한 유형의'안전'으로 사용자 가 원 하 는 대로 인 스 턴 스 속성 을 증가 하 는 것 을 방지 할 수 있다.__slots__
속성 을 가 진 클래스 정 의 는 존재 하지 않 습 니 다__slots__
.총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.