7.2 상속 도출
7.21 상속
1. 무엇을 상속? 상속은 서브 클래스는 파이썬에서 둘 이상의 상위 클래스를 지원 상속 방식의 새로운 종류이다. 새로운 클래스는 부모 클래스는 기본 클래스를 호출 할 수 있습니다 또는 슈퍼 클래스는 서브 클래스 "유전"부모 클래스 속성, 서브 클래스 또는 파생 클래스라고합니다.
2, 왜 상속해야 코드 중복을 줄일 수
클래스 ParentClass1 : 패스 클래스 ParentClass2 : 패스 클래스 Subclass1 (ParentClass1) 통과 클래스 Subclass2 (ParentClass1, ParentClass2) 패스 인쇄 (. Subclass1 __bases__ ) # (< '. __ ParentClass1 __main'클래스>) 인쇄 (Subclass2. __bases__ ) # ( < '__. ParentClass1 __main'클래스> <클래스 '__main __. ParentClass2'>)
3, 클래스와 클래스 상속 관계는 추상을 다시 상속 할 필요가이 관계를 찾을 수 있습니다
클래스 OldboyPeople : 학교 = ' 올드 보이 ' 데프 __init__ (자기, 이름, 나이, 성별) : self.name = 이름 self.age = 나이 self.sex = 성 클래스 OldboyTeacher (OldboyPeople) : # 继承OldboyPeople类데프 change_score ( 자기) : 인쇄 ( ' 교사 % s이 (가) 점수 변화 ' %의 ) self.name 클래스 Oldboystudent (OldboyPeople) : # 继承OldboyPeople类 DEF : (자동)을 선택 인쇄 ( ' %의 코스를 선택 학생을 ' %의 self.name) TEA1 = OldboyTeacher ( ' 에곤을 ' , 18, ' 남성 ' ) # 相当于OldboyTeacher .__의 init __ (...) stu1 = Oldboystudent ( ' 알렉스 ' , 73 ' 여성 ' ) 인쇄 (tea1.name, tea1.age, tea1.sex) #의 에곤 남성 18 인쇄 (stu1.name, stu1.age, stu1.sex) # 알렉스 73 여성
7.22 파생
파생 : 새로운 속성의 자신의 서브 클래스를 정의하면 자신의 서브 클래스에 따라 부모 같은 이름의 클래스와,
클래스 OldboyPeople : 학교 = ' 올드 보이 ' 데프 __init__ : (자기, 이름, 나이, 성별) self.name = 이름 self.age = 나이 self.sex = 섹스 데프 F1 (자기) : 인쇄 ( ' 爹的F1 ' ) 클래스 OldboyTeacher (OldboyPeople) : 데프 __init__ (자기, 이름, 나이, 성별, 수준, 급여) : self.name = 이름 self.age = 나이 self.sex =섹스 self.level = 레벨 self.salary = 급여 DEF의 change_score (자기) : 인쇄 ( ' 교사가 점수를 변화 % S ' % self.name) DEF F1 (자동) : 인쇄 ( ' 아들'F1 ' ) TEA1 = OldboyTeacher ( ' 에곤 ' , 18 인 ' MALE ' , 9,3.1) # 1 수신 ZE 부모가 주어진 경우, 파라미터 여섯 통과 인쇄 (tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary) # 에곤 9 3.1 18 MALE
서브 클래스에 도시 된 방법에서 7.23 재사용 능력 새로운 상위 클래스
한 가지 방법 : 호출 이름 (기준 및 할 상속 아무것도 )
클래스 OldboyPeople : 학교 = ' 올드 보이 ' 데프 __init__ : (자기, 이름, 나이, 성별) self.name = 이름 self.age = 나이 self.sex = 성 클래스 OldboyTeacher (OldboyPeople) : # 可有可无 데프 __init__ (자기 이름, 나이, 성별, 수준, 급여) : #의 self.name = 이름 #의 self.age = 연령 # self.sex = 섹스 OldboyPeople. __init__ (자기, 이름, 연령, 성별) #OldboyPeople __init__ 방식으로 함께 부모 클래스의 함수 호출을 재사용 self.level = 레벨 self.salary = 급여 TEA1 = OldboyTeacher ( ' 에곤 ' , 18이며, ' MALE ' . 9, 3.1 ) 인쇄 (tea1.name, tea1.age , tea1.sex, tea1.level, tea1.salary) # 에곤 9 3.1 18 MALE
두 번째 방법 : 슈퍼 () 호출 ( 상속에 엄격하게 의존 )
슈퍼 () 반환 값이 특히 상위 클래스의 속성을 호출하는 특별한 목적은, 슈퍼 () 찾기 위해 현재 위치에서 목록을 찾기 MRO 엄격한에 따라 미래에 계속
알아보기 : python2에서, 당신은 슈퍼 필요 (자신의 클래스의 이름을 자기)
클래스 OldboyPeople : 학교 = ' 올드 보이 ' 데프 __init__ (자기, 이름, 나이, 성별) : self.name = 이름 self.age = 나이 self.sex = 성 클래스 OldboyTeacher (OldboyPeople) : # 必须有父类 데프 __init__ ( 자기 이름, 나이, 성별, 수준, 급여) : 슈퍼 (OldboyTeacher, 자기). __init__ (이름, 나이, 성별) # OldboyPeople .__의 init __ (자기, 이름, 나이, 성별) self.level = 레벨 self.salary= 급여 TEA1 = OldboyTeacher ( ' 에곤 ' , 18 ' 남성 ' , 9, 3.1 ) 인쇄 (tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary) #의 에곤 남성 18 9 3.1
7.3 클래식과 새로운 클래스
1, 새로운 클래스 : 상속 된 개체 클래스와 클래스의 서브 클래스는, 새 클래스입니다
부모 클래스를 상속하지 않는 클래스가 지정된 경우 python3에서, 기본은 모든 클래스가 python3 새로운 클래스입니다 그래서 개체를 상속합니다
(2), 클래식 (단지 클래식과 새로운 스타일의 클래스 사이의 유일한 차이 python2에) : 상속 된 객체 클래스와 클래스의 하위 클래스가 없다, 고전 클래스입니다
클래스 푸 () : # 在의 python3의中의 패스 클래스 바 (푸) : 패스 인쇄 (. 푸 __bases__ ) # (<클래스의 객체>) 인쇄 (. 바 __bases__ ) # (<클래스 '__main__.Foo' >)
다중 상속 배경에서 7.34 찾기 등록
속성 찾기 OBJ를. X를 . 1 , OBJ를 시작합니다. __dict__ 2 , 클래스 개체를. __dict__을 . 3 , 상위 클래스. __dict__을 ..........
상속 관계는 지점 B, C를 찾아 처음에 따라야 다음 분기, D는 마침내 우리가 원하는 속성을 찾기까지이 순서의 지점을 발견 것을 발견 할 것이다 비 다이아몬드 구조 인 경우
깊이 우선과 폭 우선 : 상속은 다이아몬드 모양의 구조 인 경우, 특성, 즉를 찾을 수있는 방법은 두 가지가 있습니다
인쇄 ( F.의 __mro__) # F.mro () #은 선형 목록을 볼 수 있습니다 재산이 새로운 클래스가, 속성이 속성없이, 클래식을 위해 검색 뷰