简介
优点:
1、增加代码的耦合性,(宜精不宜多)
2、减少重复的代码
3、使代码更加规范、合理、简洁
分类:
1、单继承
2、多继承
语法:
class 类名(父类):
子类属性
子类方法
其他:
object是所有类的父类,就算类的括号里不写,默认也是继承了object。
示例:
class Animal():
typename = '动物'
def __hunt(self):
print("父类的私有方法")
def eat(self):
print("动物需要吃东西")
def water(self):
print("动物需要喝水")
class Cat(Animal):
def shout(self):
print("小猫喵喵喵~")
class Dog(Animal):
def shout(self):
print("小狗汪汪汪~")
cat1 = Cat()
cat1.eat()
cat1.shout()
print(cat1.typename)
# cat1.__hunt() 无法使用父类的私有属性、方法
dog1 = Dog()
dog1.eat()
dog1.shout()
继承的传递性
子类A的子类可以继承子类A的父类,简言之,孙子可以继承爷爷的共有属性和方法。
示例 :
class Animal():
typename = '动物'
def __hunt(self):
print("父类的私有方法")
def eat(self):
print("动物需要吃东西")
def water(self):
print("动物需要喝水")
class Cat(Animal):
sex = 'man'
def shout(self):
print("小猫喵喵喵~")
class CatBoBo(Cat):
def bobo_cat(self):
print("我是一直小猫咪,我叫bobo")
bobo = CatBoBo()
bobo.bobo_cat()
bobo.eat() # 父类的父类的方法
print("typename:",bobo.typename) # 父类的父类的属性
bobo.shout() # 父类的方法
print("sex:",bobo.sex) # 父类的属性
重写父类的方法
覆盖父类的方法,重写父类的方法,子类的方法名和父类的方法名一致。
方式1:覆盖父类的方法
如果在开发过程中,父类方法的实现和子类方法的实现完全不同,就可以使用覆盖的方法在子类中重新编写父类的方法,在运行中,只会调用在子类中重写的父类方法,而不会调用父类的方法
语法:方法名和父类的方法名一样,方法实现根据子类的需求而定。
方式2:扩展父类的方法
如果在开发过程中,子类的方法的实现包含父类方法的实现,在需要使用的位置使用父类名.方法(self)来调用父类方法的执行,代码其他位置针对子类的需求,编写子类特有的代码实现。
语法:方法名和父类的方法名一样,方法实现:父类名.方法名()
,子类的扩展方法
示例:
class Animal():
typename = '动物'
def __hunt(self):
print("父类的私有方法")
def eat(self):
print("动物需要吃东西")
def water(self):
print("动物需要喝水")
class Cat(Animal):
sex = 'man'
# 覆盖父类的方法
def eat(self):
print("小猫爱吃鱼~~")
# 重写父类的方法
def water(self):
Animal.water()
print("小猫爱喝马桶水~~")
多继承语法
class 类名(父类1,父类2):
子类属性
def 子类特有的方法
.....
其他:如果父类1和父类2有重名的方法,子类在调用的时候会去调用继承的第一个父类的方法,
如果父类1,父类2,子类有相同的方法名,子类就优先使用自己的方法。
示例:
class Animal():
typename = '动物'
def hunt(self):
print("动物需要捕猎")
def eat(self):
print("动物需要吃东西")
def water(self):
print("动物需要喝水")
class Cat():
def eat(self):
print("小猫爱吃鱼~~")
def water(self):
print("小猫咪爱喝主人杯子里的水~")
class HelloKitty(Animal, Cat):
def water(self):
print("父类也有water方法,但是我自己也有water,所以调用了我自己的")
def play(self):
print("hello kitty 自己特有的方法play")
hellokitty = HelloKitty()
hellokitty.eat() #两个父类都有eat方法,会去调用继承的第一个父类的eat方法
父类构造方法的继承与重写
情况1:父类有构造方法,子类没有,子类实例化对象时会自动调用父类的构造方法
情况2:父类有构造方法,子类也有构造方法,子类实例化对象时会调用自己的构造方法
情况3:父类有构造方法,子类也有构造方法,子类的构造方法对父类的构造方法进行扩展。
子类调用父类构造方法的语法:
super(子类,self).__init__(参数1,参数2,.....)
父类名称.__init__(self,参数1,参数2,.....)
示例
class Animal():
def __init__(self, name, sex, typename):
self.name = name
self.sex = sex
self.typename = typename
def hunt(self):
print("动物需要捕猎")
def eat(self):
print("动物需要吃东西")
def water(self):
print("动物需要喝水")
class Cat(Animal):
def cat(self):
print("我是小猫咪,我叫bobo")
bobo = Cat("bobo", "girl", "cat")
print("""我叫{},我的性别是{},我是一只{}""".format(bobo.name,bobo.sex,bobo.typename))
bobo.cat()
class Dog(Animal):
def __init__(self, name, sex, typename, type):
self.name = name
self.sex = sex
self.typename = typename
self.type = type
def shot(self):
print("小狗汪汪汪~~")
dog = Dog("旺财","公","狗","中华田园犬")
print("""我叫{},我的性别是{},我是一只{},品种是:{}""".format(dog.name,dog.sex,dog.typename,dog.type))
dog.shot()
class Pig(Animal):
def __init__(self, weight,name,sex,typename):
self.weight = weight
Animal.__init__(self,name,sex,typename)
def shot(self):
print("小猪哼哼哼~~")
pig = Pig(300,"居居","公","小猪")
print("""我的体重是{}斤,我叫{},我的性别是{},我是一只{}""".format(pig.weight,pig.name,pig.sex,pig.typename))
pig.shot()