目录

继承

继承方法重写

多态


python是面向对象的语言,也支持面向对象编程的三大特性:继承、封装、多态。

*封装(隐藏)

        隐藏对象的属性和实现细节,只对外提供必要的方法,相当于将“细节封装起来”,只对外暴露“相关调用方法”。

        通过“私有属性,私有方法“的方式,实现”封装”,python追求简洁的语法,没有严格的语法级别的“访问控制符”。

*继承

         继承可以让子类具有父类的特性,提高代码的重用性。

         从设计上是一种增量进化,原有父类设计不变的情况下,可以增加新功能,或者改进已有的算法。

*多态

        多态是指同一个方法调用由于对象不同会产生不同的行为,生活中这样的例子比比皆是:同样是休息,人不同休息的方法不同,有的休息是睡觉,有的休息是玩游戏等等。

------------------------------------------------------------------------------------------------------------------------------------------------------------------

继承

       继承是面向对象程序设计的重要特征,也是实现“代码复用”的重要手段。

       如果一个新类继承自一个设计好的类,就直接具备了已有类的特征,就大大降低类工作难度,已有的类,称为“父类或者基类”,新的类,称为“子类或者派生类”。

       语法格式:

       python支持多重继承,一个子类可以继承多个父类,继承的语法格式如下:

                   class  子类类名(父类1[,父类2,....]):

                             类体

       如果在类定义中没有指定父类,则默认父类是object类,也就是说,object是所有类的父类,里面定义了一些所有类共有的默认实现,比如:__new__();

       定义子类时,必须在其他构造函数中调用父类的构造函数,调用格式如下:

       父类名.__init__(self,参数列表)

  • 多重继承

      python支持多重继承,一个子类可以有多个”直接父类“。这样,就具备了“多个父类”的特点,但是由于,这样会被“类的整体层次”搞的异常复杂,尽量避免使用。查看类多重继承结构

继承方法重写

  1. 成员继承:子类继承父类除构造方法之外的所有成员。
  2. 方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为“重写”

简单方法重写使用

# 测试继承方法重写的简单使用
class Person(object):
    def __init__(self, name, age):
         = name
        self.__age = age

    def say_age(self):
        print("你是:{},年龄:{}".format(, self.__age))


class Student(Person):
    def __init__(self, name, age, score):
        Person.__init__(self, name, age)  # 必须显示的调用父类初始化方法,不然解释器不会去调用
        self.score = score

    def say_age(self):
        """
        重写了父类的方法
        :return:
        """
        print('我是:{},年龄:{}'.format(, self.score))


if __name__ == '__main__':
    st = Student('张三', 13, 23)
    print(dir(st))  # 查看对象的所有属性
    st.say_age()

重写__str__()方法

object有一个__str__()方法,用于返回一个“对象的描述”,对应于内置函数str(),经常用于print()方法,帮助我查看对象的信息,__str__可以重写。

# 重写object类里面的__str__方法,此方法是返回一个对于"对象的描述"
class per: #默认继承object类
    def __init__(self, name):
         = name

    def __str__(self):
        return "对象是:{}".format()


if __name__ == '__main__':
    p = per('张三')
    print(p)

执行返回:

不重写__str__,返回:<__main__.per object at 0x7fbe2a2856a0>

重写__str__,返回:对象是:张三

super()获得父类定义

在子类中,想要获得父类的方法时,可以通过super()来做,

super()代表父类的定义,不是父类对象

# 测试super(),代表父类定义,而不是父类的对象
class a:
    def say_age(self):
        print('你好撒:', self)


class b(a):
    def say_age(self):
        # a.say_age(self)  # 调父类的方法,这种在调用单继承的时候没有问题,

        super().say_age()  # 调用父类的方法,这种是解决多继承的问题
        print('b是啥:', self)


b().say_age()

多态

        多态是指同一个方法调用由于不同可能会产生不同的行为。

        关于多态要注意一下两点:

        1.多态是方法的多态,属性没有多态

        2.多态的存在有2个必要条件:继承、方法重写

    【例子】

      

# 多态
class Man:
    def eat(self):
        print('饿了,需要吃饭')

class Chinese(Man):
    def eat(self):
        print('中国人开始吃饭,筷子已备好')

class English(Man):
    def eat(self):
        print('英国人开始吃饭,刀叉已备好')

class Indian(Man):
    def eat(self):
        print('印度人开始吃饭,自备吧,我也不知道你用啥了')

def manEat(m):
    if isinstance(m, Man):  # m是否是Man的子类
        m.eat()
    else:
        print('闲饿着吧,,还没有开饭')

manEat(Chinese())
manEat(English())
manEat(Indian())

执行返回

python语言的多态性 python有多态特性吗_子类