【知识点】
面向对象的三大特性:继承、多态、封装
【继承】
(1)继承:class Person(Animal): ——括号里的:父类,基类,超类 括号外的:子类,派生类
1 class Animal: 2 def __init__(self,name,sex,age): 3 self.name=name 4 self.sex=sex 5 self.age=age 6 7 class Person(Animal): 8 pass 9 10 p1=Person('小明','男',20) 11 print(p1.__dict__) # {'name': '小明', 'sex': '男', 'age': 20}
(2)初识继承:子类以及子类实例化的对象 可以访问父类的任何方法或变量
#1、类名可以访问父类的所有东西
1 class Animal: 2 breath='呼吸' 3 4 def __init__(self,name,sex,age): 5 self.name=name 6 self.sex=sex 7 self.age=age 8 9 def eat(self): 10 print("动物都需要吃东西...") 11 12 class Person(Animal): 13 pass 14 15 print(Person.breath) # 呼吸 (用类名进行访问) 16 Person.eat(111) # 动物都需要吃东西... (类名访问方法)
#2、子类实例化的对象也可以访问父类所有东西
1 p1=Person('小明','男',20) 2 print(p1.breath) # 呼吸 (用子类实例化对象访问父类静态变量) 3 p1.eat() # 动物都需要吃东西... (用子类实例化对象访问父类方法)
#3、查询顺序
(3)继承关系中执行方法
#1、只执行父类的方法:子类中不要定义与父类用名的方法
#2、只执行子类的方法,在子类中创建这个方法
#3、既要执行父类中的方法也要执行子类中的方法?
两种解决方法:
① 在自己的类中调用父类的__init__方法(Animal.__init__(self,name,sex,age)。
并且,在自己的类中定义def __init(self,name,sex,age,wing) 在下面添加self.wing=wing
1 # 既要执行父类中的方法也要执行子类中的方法? 2 # 解决方法1: 3 class Animal: 4 5 def __init__(self,name,sex,age): 6 self.name=name 7 self.sex=sex 8 self.age=age 9 10 def eat(self): 11 print("%s吃东西" % (self.name)) 12 13 14 class Bird(Animal): 15 16 def __init__(self,name,sex,age,wing): 17 # 类名调用方法需要全部参数,若是对象,不需要self 18 Animal.__init__(self,name,sex,age) #调用父类的__init__方法 19 self.wing=wing 20 21 def bark(self): 22 print("唧唧叫") 23 24 b=Bird('鹦鹉','公',20,'绿翅膀') 25 print(b.__dict__) # {'name': '鹦鹉', 'sex': '公', 'age': 20, 'wing': '绿翅膀'}
②super(本类,self).__init__(name,sex,age) #可以简写:super().__init__(name,sex,age)
1 # 解决方法2: 2 class Animal: 3 4 def __init__(self,name,sex,age): 5 self.name=name 6 self.sex=sex 7 self.age=age 8 9 def eat(self): 10 print("%s吃东西" % (self.name)) 11 12 13 class Bird(Animal): 14 15 def __init__(self,name,sex,age,wing): 16 # 类名调用方法需要全部参数,若是对象,不需要self 17 #Animal.__init__(self,name,sex,age) #调用父类的__init__方法 18 super().__init__(name,age,wing) #简写 原本:super(Bird,self).__init__(name,sex,age) 19 self.wing=wing 20 21 def bark(self): 22 print("唧唧叫") 23 24 b=Bird('鹦鹉','公',20,'绿翅膀') 25 print(b.__dict__) # {'name': '鹦鹉', 'sex': '公', 'age': 20, 'wing': '绿翅膀'}
(4)继承的进阶
继承:单继承、多继承
类:经典类,新式类
#1、新式类:凡是继承object类都是新式类
python3x 所有的类都是新式类。 因为python3x中的类都默认继承object
#2、经典类:不继承object类都是经典类
python2x 所有的类默认都不继承object类,所有的类默认都是经典类
★在python2x中出现如下情况为新式类:
1 class A(object): 2 pass
因此,python2x中既有经典类也有新式类
#3、单继承:新式类、经典类查询顺序一样(依次往上)
#4、多继承:
新式类:遵循广度优先
经典类:遵循深度优先
①多继承新式类:class F(D,E): 查询类的继承顺序方法:print(类名.mro())
一条路走到倒数第二级,然后判断,如果其他路能走到终点,则返回走另一条路,否则走到终点。(每个节点只走一次)
②多继承经典类:(一条路走到底)
#5、继承的优点:节省代码,规范代码
时间:2020-02-12 16:12:50
来源:https://www.cnblogs.com/fengxb1213/p/12299349.html