Python 학습 노트-클래스 소개,계승,개인 구성원
5323 단어 종류python프로 그래 밍 언어
Python 에 도 이러한 개념 이 있 고 모든 대상 언어 와 유사 합 니 다(C++가 아 닌 자바 와 유사 합 니 다).다만 Public,private,proctected 키워드 가 없습니다.Python 은 이러한 키워드 의 기능 을 자신의 방법 으로 지원 하지만 사용자 가 스스로 지 켜 야 합 니 다.엄격 한 지원 이 아니 기 때 문 입 니 다.
우선,간단 한 예 에서 Python 의 구성 을 배 웁 니 다.(Python 3.3)
class Dog:
def __init__(self):
self.nr=1# self.nr+=1 is wrong
#Dog.nr=111
def __del__(self):
pass
class Cat:
nr=0
def __init__(self):
self.nr=9# or self.nr+=9
Cat.nr+=1
dog1=Dog()
print(dog1.nr)
#print(Dog.nr)
cat1=Cat()
print("cat1.nr=",cat1.nr,", Cat.nr=",Cat.nr,sep='')
cat2=Cat()
print("cat2.nr=%d, Cat.nr=%d"%(cat2.nr,Cat.nr))
상례 에서 두 종류의 Dog 와 Cat 를 정의 하고 두 함수 를 각각 정의 했다init__(), __del__(),이 두 함 수 는 시스템 이 정의 하 는 함수 이다.func__모두 시스템 정의 함수 이 고 앞 뒤 두 개의 밑줄)은 구조 함수 와 석조 함 수 를 나타 내 며 모두 생략 하고 쓰 지 않 을 수 있 습 니 다.클래스 방법 을 정의 할 때 첫 번 째 매개 변 수 는 써 야 합 니 다.self 를 쓰 는 것 을 권장 합 니 다.
클래스 에 나타 난 변 수 는 간단하게 말하자면 Cat 클래스 에서 self.nr 와 Cat.nr 두 가지 가 있 는데 그들의 차 이 는 self.nr 는 클래스 실례 의 변수 이 고 Cat.nr 는 클래스 의 변수 이다.한편,Dog 류 에 서 는 Dog.nr 에 값 을 부여 한 적 이 없 기 때문에 Dog.nr 가 없 으 면 클래스 밖에서 Dog.nr 를 사용 할 수 없습니다.또한,또 다른 주의해 야 할 것 은 init 함수 에서 self.nr 가=오른쪽 에 나타 나 면 이미 부 여 된 값 이나 클래스 이름.nr 라 는 변수 가 값 이 있 는 지 확인 해 야 합 니 다.왜냐하면+=등 동작 이 self.nr 를 사용 해 야 할 때 함수 내 에서 self.nr(즉,사용 하지 않 음=self.nr 에 값 을 부여 한 적 이 없 음)를 찾 으 면 함수 밖의 클래스 변수 에서 찾 습 니 다.찾 으 면 클래스 의 nr 변수의 값 을 인 스 턴 스 자신의 nr 변수의 초기 값 으로 간주 한 다음 에 클래스 인 스 턴 스 자신의 nr 에 값 을 부여 합 니 다.다음 Dog 1 은 옳 고 Dog 2 는 틀 렸 습 니 다.
class Dog1:
def __init__(self):
Dog.nr=111
self.nr+=1
class Dog2:
def __init__(self):
self.nr+=1
Dog.nr=111
실제로 클래스 변수의 이러한 상황 은 계승 에서 도 나타난다.만약 에 하위 클래스 에서 특정한 변수 가 사용 되 지 않 으 면=값 을 부여 하면 부모 클래스 에서 이 변 수 를 호출 할 수 있다.
계승,다 중:
class Animal:
nr=0
def __init__(self):
self.nr+=1
Animal.nr+=1
def __del__(self):
pass
def act(self):
print("Act.")
def sleep(self):
print("Sleep.")
class Bird(Animal):
def __init__(self):
self.nr+=1
Bird.nr+=1
def act(self):
print("Fly.")
bird1=Bird()
print(bird1.nr,Bird.nr)
print(bird1.act())
bird1.sleep()
bird2=Bird()
print(bird2.nr)
print(bird1.nr,bird2.nr,Animal.nr,Bird.nr)
animal1=Animal()
print("Animal.nr=",Animal.nr)
Bird 는 Animal 의 하위 클래스 로 SubClass(Class)와 같은 형태 로 정의 합 니 다.하위 클래스 는 부모 클래스 의 모든 공공 데이터(변수 와 방법 포함)를 계승 할 수 있 으 며,같은 이름 의 방법 으로 부모 클래스 를 덮어 쓰 는 방법(즉 다 중)을 사용 할 수 있 습 니 다.상례 에서 Bird 는 Animal 의 nr 변수(물론 Bird.nr 와 Animal.nr 의 값 은 다음 에 상세 하 게 토론 해 야 합 니 다)와 모든 방법 을 계승 하 였 으 나 초기 화 함수 와 act()함 수 를 스스로 다시 썼 습 니 다.그래서 bird1.act()를 실행 할 때 Bird 류 의 act()를 호출 하고 bird1.sleep()에 서 는 Animal.sleep()함 수 를 호출 합 니 다.
Bird 의 init()에서 Bird.nr+1 은 실제 Bird.nr=Animal.nr+1,self.in+1 도 self.nr=Animal.nr+1 과 같 습 니 다.이전에 Bird.nr 에 값 을 부여 한 적 이 없 기 때문에 Bird 류 에서 nr 변 수 를 찾 을 수 없 을 때 부모 류 에서 찾 습 니 다.찾 지 못 하면 잘못 보고 합 니 다.self.nr 는 같은 이치 로 하나의 변수 일 뿐 인 스 턴 스 변수 입 니 다.Bird.nr 에 값 을 부여 하면 Bird.nr 는 Animal.nr 가 아니 라 자신의 값 이 있 습 니 다.아래 의 이 Bird 류 는 Bird.nr 에 값 을 부여 하지 않 고 그 값 만 사 용 했 기 때문에 Bird.nr 는 실제 적 으로 Animal.nr 이 고 새로운 할당 메모리 가 저장 되 지 않 았 습 니 다.Animal.nr 를 바 꾼 후에 Animal.nr 와 Bird.nr 를 보고 검증 할 수 있 습 니 다.
class Bird(Animal):
def __init__(self):
Animal.__init__(self)
self.nr=Bird.nr+1
def act(self):
print("Fly.",Bird.nr)
또한,Python 은 C++,자바 와 같은 매개 변수 유형 과 수량 에 따라 재 부팅(overload)을 지원 하지 않 습 니 다.즉,함수 이름 만 함수 신분 으로 판단 하고 매개 변수 에 따라 판단 하지 않 습 니 다.그리고 여러 개의 동명 함수 가 나타 나 면(매개 변수 가 같 든 없 든)마지막 을 기준 으로(즉,나중에 나타 나 는 함수 가 이전의 동명 함 수 를 덮어 씁 니 다).
개인 구성원:
파 이 썬 은 Public,private,proctected 라 는 키워드 가 없습니다.그러면 파 이 썬 은 어떻게 이러한 기능 을 실현 합 니까?
실제로 Python 은 자신 만 의 독특한 방법 으로 이 루어 졌 습 니 다.함수 명 이 다음 과 같은 임의의 형식 이 라면 특별한 의 미 를 가 집 니 다.
_func:proctected func 에 해당 하지만 특정한 함수 가 클래스 밖 에 적 혀 있 을 때 만 from module import*를 통 해 다른 모듈 에 의 해 얻 을 수 없고 다른 상황 은 모두 얻 을 수 있 습 니 다.
__func__: 시스템 정의 함 수 를 표시 하기 때문에 이러한 전후 각 두 개의 밑줄 을 그 는 방법 으로 사용자 자신의 함 수 를 정의 하 는 것 을 최대한 피한다.
__func:private func 에 해당 하지만 절대적 인 private 는 아 닙 니 다.다음 예 를 통 해 그 원 리 를 설명 합 니 다.
class Parent:
def __init__(self):
# print('a')
self.__act()
self.sleep()
def __act(self):
print("Parent acts.")
def sleep(self):
print("Parent sleeps.")
class Child(Parent):
def __act(self):
print("Child acts.")
def sleep(self):
print("Child sleeps.")
c=Child()
실행 결 과 는:
Parent acts.
Child sleeps.
보 입 니 다.여기 Parent.act()함수 가 덮어 쓰 이지 않 았 습 니 다.이것 은 Python 에서 와 같 기 때 문 입 니 다.시작 함수 name mangling,곧func()변ClassName__func(),그래서 처 리 된 self.act()self.Parent__act(),그리고 defact(self)defParent__act(self),init 함 수 를 바 꾸 어 검증 할 수 있 습 니 다:self.act()명시 적 으로 self. 로 변경Parent__act(),함수 정 의 를 바 꿀 필요 가 없습니다.
그래서 파 이 썬 은 이러한 키워드 와 유사 한 기술 을 제 공 했 지만 절대적 으로 안전 한 것 이 아니 라 사용자 가 스스로 지 키 고 파괴 하지 않 아야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 멀티태스킹과 인터페이스를 실현하는 클래스의 대상을 인터페이스에 인용하는 방법(추천)우리는 인터페이스 유형의 인용 변수를 정의하여 인터페이스를 실현하는 클래스의 실례를 인용할 수 있다. 클래스 B와 클래스 C의 실례를 인터페이스 인용 a에 부여함으로써 방법이 운행할 때의 동적 귀속을 실현했고'하나의...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.