美文网首页“老奶奶”的python学习笔记
“老奶奶”的python学习笔记(13)

“老奶奶”的python学习笔记(13)

作者: 菁_在路上 | 来源:发表于2019-12-03 11:03 被阅读0次

    知识体系

    第13关:类的定制和继承

    知识点

    类基础知识代码

    举例:

    class Chinese: # 类的创建

        eye = 'black' # 类属性的创建

        def __init__(self,hometown): # 类的初始化方法

            self.hometown = hometown # 实例属性的创建

            print('程序持续更新中……') # 初始化中的语句

        def born(self): # 实例方法的创建

            print('我生在%s。'%(self.hometown)) # 方法的具体语句

    wufeng = Chinese('广东') # 类的实例化

    print(wufeng.eye) # 打印实例的属性(从类传递的)

    wufeng.born() # 实例方法的调用

    #》》 程序持续更新中…… black 我生在广东。

    什么是类的继承和定制

    类的继承

    在Python中,我们的习惯表述是:A类是B类的子类,而B类是A类的父类(或超类)。

    类的定制

    只有继承的话,子类只是父类的复制而已。

    只有增加类的定制才能产生一个不同于父类的新功能。 子类除了继承父类的属性方法外,还可以创造【属于自己】的属性或方法。甚至,广东人还可以【调整继承到的属性或方法】。

    如中国人有个属性“居住的陆地面积(单位:万平方公里)”的值为960,广东人继承后需要将这个属性的值改为17.98。

    同样,子类也可以在继承的基础上进行个性化的定制,包括:(1)创建新属性、新方法;(2)修改继承到的属性或方法。

    如何编写类的继承和定制代码

    编写“类的继承”代码

    继承的基础语法

    举例:

    class Chinese:

        eye = 'black'

        def eat(self):

            print('吃饭,选择用筷子。')

    class Cantonese(Chinese): # 通过继承,Chinese类有的,Cantonese类也有

        pass

    # 验证子类可以继承父类的属性和方法,进而传递给子类创建的实例

    yewen = Cantonese() # 子类创建的实例,从子类那间接得到了父类的所有属性和方法

    print(yewen.eye) # 子类创建的实例,可调用父类的属性

    yewen.eat() # 子类创建的实例,可调用父类的方法

    可见:通过一个小括号,子类就能轻轻松松地拥有父类所拥有的一切。不用复制大段大段的代码,只要一个括号,就能复用整块代码。

    特别情况说明

    很多类在创建时也不带括号,如class Chinese:。

    这意味着它们没有父类吗?并不。 实际上,class Chinese:在运行时相当于class Chinese(object):。而object,是所有类的父类,我们将其称为根类(可理解为类的始祖)。

    可以验证所属类的函数isinstance()

    用途:用于验证所属类

    用法:具体用法是输入两个参数(第一个是实例,第二个是类或类组成的元组),输出是布尔值(True 或 False)

    举例:

    print(isinstance(1,int)) # 判断1是否为整数类的实例

    print(isinstance(1,str))

    print(isinstance(1,(int,str))) # 判断实例是否属于元组里几个类中的一个

    #》》

    True

    False

    True

    特别说明:

    1、子类创建的实例同时也属于父类;

    2、父类创建的实例不属于子类;

    3、类创建的实例都属于根类。

    类的多层继承和多重继承

    多层继承:纵深拓展

    继承不仅可以发生在两个层级之间(即父类-子类),还可以有父类的父类、父类的父类的父类……。这样一来,层级就出来了。只要你愿意,你可以继续拓展上面的例子,或往上(地球人),或往下(深圳人)

    多重继承:宽度拓展

    一个类可以同时继承多个类

    语法为class A(B,C,D):

    括号里的顺序是有讲究的。和子类更相关的父类会放在更左侧

    举例:

    class Su:

        born_city = 'Jiangsu'

        wearing = 'thick'

        def diet(self):

            print('我们爱吃甜。')

      class Yue:

        settle_city = 'Guangdong'

        wearing = 'thin'

        def diet(self):

            print('我们吃得清淡。')

    class Yuesu(Yue,Su):

        pass

    xiaoming = Yuesu()

    # 先在 Yue类找,找到了,打印出来。

    print(xiaoming.wearing)

    # Yue类没有born_city,才去Su类找。

    print(xiaoming.born_city)

    # 方法调用,和属性调用一样,也符合就近原则。

    xiaoming.diet()

    编写“类的定制”代码

    定制可以新增代码

    我们可以在子类下新建属性或方法,让子类可以用上父类所没有的属性或方法

    举例:

    class Chinese:

        eye = 'black'

        def eat(self):

             print('吃饭,选择用筷子。')

    class Cantonese(Chinese): # 类的继承

        native_place = 'guangdong' # 类的定制

        def dialect(self): # 类的定制

            print('我们会讲广东话。')

    yewen = Cantonese()

    print(yewen.eye) # 父类的属性能用

    print(yewen.native_place) # 子类的定制属性也能用

    yewen.eat() # 父类的方法能用

    yewen.dialect() # 子类的定制方法也能用

    定制可以重写代码

    重写代码,是在子类中,对父类代码的修改。

    正常的操作使用方法:

    子类继承父类方法的操作是在def语句后接父类.方法(参数),这样一来,父类方法中的说法改变,子类也不用去动,因为子类直接继承了父类的方法。只不过,在继承的基础上,通过参数的调整完成了定制。而参数的调整,可以增加参数(如 rate),也可以改变参数的默认值。

    举例

    (笨的方法):

    已知中国的陆地面积,也知道广东的陆地面积占比为1.88%

    class Chinese:

        def land_area(self,area):

            print('我们居住的地方,陆地面积是%d万平方公里左右。'% area)

    class Cantonese(Chinese): # 直接对方法进行重写

        def land_area(self,area):

            print('我们居住的地方,陆地面积是%d万平方公里左右。'% int(area * 0.0188))

    (正常的操作使用方法):

    class Chinese:

        def land_area(self,area):

            print('我们居住的地方,陆地面积是%d万平方公里左右。'% area)

    class Cantonese(Chinese): # 间接对方法进行重写

        def land_area(self, area, rate = 0.0188):

            Chinese.land_area(self, area * rate) # 直接继承父类方法,再调整参数。

    gonger = Chinese()

    yewen = Cantonese()

    gonger.land_area(960)

    yewen.land_area(960)

    相关文章

      网友评论

        本文标题:“老奶奶”的python学习笔记(13)

        本文链接:https://www.haomeiwen.com/subject/wwxcgctx.html