类的继承
类的继承主要指类的从属关系,比如A类属于B类的话,B类的范围更广,A类作为B类的子类可以继承B类的属性和方法,且这种继承可以没有限制,多层继承。另外一种,A类可以C,D,F的子类,此时A可以调用CDF的属性和方法,需要注意的是顺序表示类之间的相同性越近。
类的继承的语法
class A(B): #单一继承
pass
class H(A):
pass #H与B之间为多层继承
class A(C,D,F):#多重继承
pass
子类的实例可以调用父类的属性和方法,没有限制,多重继承关系中首先从第一顺位(也就是上面的C)开始寻找是否具有调用的属性或方法,没有则顺次后移寻找。
python库里所有的类都是Object的子类,因此Object也叫根类。
判断某两类之间的关系用isinstance(A,B),返回布尔值。
类的定制
类的定制指在已经具有继承关系的前提下,子类可以对父类的属性或方法进行修改,满足不同的运行需求。
一般有两种定制:新增代码,重写代码
新增代码:
class Chinese:
def land_area(self,area):
print('我们居住的地方,陆地面积是%d万平方公里左右。'% area)
##上面是父类
class Cantonese(Chinese): ##子类
live_place = 'guangdong' #新增属性
def dialect(self): #新增方法
print('讲广东话')
yewen = Cantonese() #类的实例化创建yewen
print(yewen.live_place) #调用子类新增的属性
yewen.dialect() #调用子类新增的方法
重写代码:
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)#子类方法调用
初始化方法的定制
class Chinese:
def __init__(self, greeting='你好', place='中国'):
self.greeting = greeting
self.place = place
def greet(self):
print('%s!欢迎来到%s。' % (self.greeting, self.place))
# 请为子类完成定制,代码量:两行。
class Cantonese(Chinese):
def __init__(self,greeting='雷猴',place='广东'): #若修改参数时,已有的默认参数不需要修改时可不必再重复
Chinese.__init__(self,greeting,place)
yewen = Cantonese()
yewen.greet()
13关作业练习2
class Student:
def __init__(self, name, job=None, time=0.00, time_effective=0.00):
self.name = name
self.job = job
self.time = time
self.time_effective = time_effective
def count_time(self, hour, rate):
self.time += hour
self.time_effective = hour * rate
# 请你完成子类的定制(包括初始化方法和count_time函数)
class Programmer(Student):
#def __init__(self,name,job='programmer',time=0,time_effective=0):
#Student.__init__(self,name,job,time,time_effective)
#注释掉的是我写的,子类里面姓名是一直变化,后面三个参数是默认值,可在定制中省略
def __init__(self, name):
Student.__init__(self, name, job='programmer', time=0.00, time_effective=0.00)
def count_time(self,hour,rate=1):
Student.count_time(self,hour,rate)
# 通过两个实例,完成子类和父类的对比(可自行验证)
student1 = Student('韩梅梅')
print(student1.job)
student1.count_time(8,0.8)
print(student1.time_effective)
student2 = Programmer('李雷')
print(student2.job)
student2.count_time(8)
print(student2.time_effective)
结果:
None
6.4
programmer
8