继承

来源:互联网 发布:日式装修知乎 编辑:程序博客网 时间: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)
原创粉丝点击