什么是继承?
- 专业角度:B类继承A类,B类就叫做A的子类/派生类,A就叫做B类的父类/超类
- B类以及B类的对象可以使用A 类的所有的属性以及方法
继承的优点:
- 节省代码
- 增强耦合性
- 使代码更加规范化
通过一个例子看一下继承:
class Person:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
class Cat:
def __init__(self,name,sex,age):
self.name = name
self.age = age
self.sex = sex
class Dog:
def __init__(self,name,sex,age):
self.name = name
self.age = age
self.sex = sex
# 继承的用法
class Animal:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
class Person(Animal):
psss
class Dog(Animal):
pass
class Cat(Animal):
pass
单继承
-
从类名执行父类的属性
-
从对象执行父类的属一切(实例化对象一定会发生三件事,一定会执行
__init__
)注意:子类以及子类对象只能调用父类的属性以及方法,不能操作(增删改)
class Animal:
live = '有生命'
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print(self) # 哪个对象执行方法就将这个对象的地址传给方法中的self
print('都要吃饭')
class Dog(Animal):
pass
d = Dog('黑豆',6,'ladboy')
print(d.__dict__)
print(d.live)
d.eat()
#如何既要执行父类方法又要执子类方法
class Animal:
live = '有生命'
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def eat(self):
# print(self)
print('都要吃饭')
class Dog(Animal):
def __init__(self,name,age,sex,hobby):
# Animal.__init__(self,name,age,sex) # 方法一
# super(Dog,self).__init__(name,age,sex) # 方法二
super().__init__(name,age,sex) # 方法二简写
self.hobby = hobby
def eat(self):
super().eat()
print('吃饭啦')
d = Dog('黑豆',6,'ladboy','抢球')
print(d.__dict__)
d.eat()
# 执行顺序: 实例化对象必须执行__init__方法,子类中没有,从父类中找,父类没有,从object中找
# 先要执行自己类中的eat方法,自己类没有才能执行父类的方法
# 单继承练习题
class Base:
def __init__(self, num):
self.num = num # num = 123
def func1(self):
print(self.num)
class Foo(Base):
pass
obj = Foo(123)
obj.func1() # 123 运⾏的是Base中的func1
class Base:
def __init__(self, num):
self.num = num # num = 123
def func1(self):
print(self.num)
class Foo(Base):
def func1(self):
print("Foo. func1", self.num)
obj = Foo(123)
obj.func1() # Foo. func1 123 运⾏的是Foo中的func1
class Base:
def __init__(self, num):
self.num = num
def func1(self):
print(self.num)
self.func2()
def func2(self):
print("Base.func2")
class Foo(Base):
def func2(self):
print("Foo.func2")
obj = Foo(123)
obj.func1() # 123 Foo.func2 func1是Base中的 func2是⼦类中的
class Base:
def __init__(self, num):
self.num = num
def func1(self):
print(self.num)
self.func2()
def func2(self):
print(111, self.num)
class Foo(Base):
def func2(self):
print(222, self.num)
lst = [Base(1), Base(2), Foo(3)]
for obj in lst:
obj.func2() # 111 1 | 111 2 | 222 3
class Base:
def __init__(self, num):
self.num = num
def func1(self):
print(self.num)
self.func2()
def func2(self):
print(111, self.num)
class Foo(Base):
def func2(self):
print(222, self.num)
lst = [Base(1), Base(2), Foo(3)]
for obj in lst:
obj.func1()
多继承
class ShenXian: # 神仙
def fei(self):
print("神仙都会⻜")
class Monkey: # 猴
def chitao(self):
print("猴⼦喜欢吃桃⼦")
class SunWukong(ShenXian, Monkey): # 孙悟空是神仙, 同时也是⼀只猴
pass
sxz = SunWukong() # 孙悟空
sxz.chitao() # 会吃桃⼦
sxz.fei() # 会⻜
Python中类的种类(继承需要):
-
在Python2.2之前都是经典类
-
Python2.2--2.7之间存在两种类型,经典类和新式类.
经典类:基类不继承object 查询规则:依靠深度优先的原则(从左到右,每次走到头)
新式类:基类必须继承object 查询规则:mro算法
Python3X 只有新式类. 如果基类谁都不继承. 那这个类会默认继承 object