继承
来源:互联网 发布:日式装修知乎 编辑:程序博客网 时间:2024/06/10 15:05
单继承
继承了父类的方法和属性,可以访问,但是私有属性和私有方法不能直接访问,
父类的私有属性不会继承, 但是可以通过公有方法去访问和设置
如果子类里的函数名和父类里的函数名重复了,调用的时候子类的覆盖父类的函数
1, 父类 模块
class Add(object): def __init__(self,name,age,weight): self.name = name self.__age = age self.weight = weight def setAge(self,age): if age > 18: self.__age = age else: print('你太小了') def getAge(self): return self.__age # 私有方法 def __eat(self): print("你看这个人会吃饭") # 嵌套私有方法,就可以在子类看到了,但是自己访问不到 def run(self): self.__eat() print("你看这个人会跑") def __str__(self): return 'name = %s, __age = %d, weight = %d'%(pp.name,pp.__age,pp.weight)
2, 子类的模块
from user import Addclass Add01(Add): def __init__(self,name,age,weight,heigh): # super代表父类,继承父类的属性 super(Add01, self).__init__(name, age,weight) self.heigh = heigh def func(self): print('ni真能吃')a = Add01('小明',13,130,120)print(a.name)# 访问私有属性print(a.getAge())# 访问方法a.run()
多继承
跟单继承一样,都是继承父类的方法
不过多继承不是继承一个父类,而是继承很多的父类,这些父类的属性和方法都被子类所继承了,可以任意调用他们的属性和方法子类继承与多个父类时,并且子类无init构造方法时,则按继承顺序,那个父类在最前面,且有自己的
init,则继承他,若果最前面的父类没有init,则继承第二个父类init,若还是无init,依次
往后找,知道找到为止, 若没有找到,则是空的构造
若子类有init方法,则直接调用子类多继承调用父类的顺序
根据参数依次往下执行,等最后一个参数执行完了之后,再依次反向返回,有点像递归
(A,B,C,D)
A–>B–>C–>D–>C–>B–>A
其中的一个父类
from mather import Matherfrom father import Fatherclass Child(Father,Mather): def __init__(self,money,faceValue): # super(Child, self).__init__(money) # super(Father,self).__init__(faceValue) # 两种方法一样 Father.__init__(self,money) Mather.__init__(self,faceValue)
子类
from child import Childc = Child(23,24)# 调用属性print(c.money)# 调用父类的方法c.playChild()# 调用另一个父类的方法c.eat()# 调用父类同名的方法,如果父类有同名的方法,那个父类在前面,则调用谁# 根据传入参数的前后顺序c.func()
多态:
一个事务的多种形态
多态就是多种表现形态的意思。它是一种机制、一种能力,而非某个关键字。它在类的继承中得以实现,在类的方法调用中得以体现。多态意味着变量并不知道引用的对象是什么,根据引用对象的不同表现不同的行为方式。
多态的好处就是,当我们需要传入更多的子类,例如新增 Teenagers、Grownups 等时,我们只需要继承 Person 类型就可以了,而print_title()方法既可以直不重写(即使用Person的),也可以重写一个特有的。这就是多态的意思。调用方只管调用,不管细节,而当我们新增一种Person的子类时,只要确保新方法编写正确,而不用管原来的代码。这就是著名的“开闭”原则:
对扩展开放(Open for extension):允许子类重写方法函数
对修改封闭(Closed for modification):不重写,直接继承父类方法函数小结
继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写;
有了继承,才能有多态。在调用类实例方法的时候,尽量把变量视作父类类型,这样,所有子类类型都可以正常被接收;
# Animalclass Animal(object): def __init__(self, name): self.name = name def eat(self): print("%s正在吃东西" % (self.name))
# Catfrom animal import Animalclass Cat(Animal): pass def eat(self): print("%s正在吃老鼠"%(self.name))
# Dogfrom animal import Animalclass Dog(Animal): pass def eat(self): print("%s正在吃骨头"%(self.name))
# Personclass Person(object): def feedAnimal(self,ee): ee.eat()
from cat import Catfrom dog import Dogfrom animal import Animalfrom person import Personcat = Cat("cat")cat.eat()dog = Dog("dog")dog.eat()p = Person()p.feedAnimal(cat)p.feedAnimal(dog)