“老奶奶”的python学习笔记(13)
知识体系
第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)