“老奶奶”的python学习笔记

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

2019-12-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)

上一篇下一篇

猜你喜欢

热点阅读