Q1:这里A继承了B,是继承了B什么?
A1:继承了B的所有的方法和属性,B中的方法和属性A都拥有
Q2:这里打印出来的为什么是C3?——#C0 C1 C2 C3 C4练习
A2:在这里,C4是C1、C2、C3的子类。但你会发现C1、C2、C3都是C0的子类。
同一个父类(这里是C0)的时候,我们会先从父类的子类也就是(C1、C2、C3)下面开始找,看看哪个有name。发现C3下面有name,那就用C3的。
Q3:为什么'广东'传给了hometown?——#出生地:广东 练习
A3:因为你初始化函数的时候设定了一个参数,所以实例化的时候是传给它的(可以看下助教画的传参步骤)
Q4:这里写pass和不写的区别是什么?——#眼睛、吃饭用筷子练习
A4:pass的作用是不执行任何操作,但pass本身是一个语句,所以计算机还是会执行该语句的,但如果不写,计算机会报错,因为计算找不到可执行的代码,就会报错
#居住地方面积练习(两个易错点)
Q1:SyntaxError: non-default argument follows default argument
自动检测class Chinese:
def land_area(self,area):
print('我们居住的地方,陆地面积是%d万平方公里左右。' % area)
class Cantonese(Chinese):
# 为参数 area 设置默认值。
def land_area(self,a=960, b=0.0188,c):
Chinese.land_area(self, a*b*c)
yewen = Cantonese()
yewen.land_area(10)
A1:第7行代码中的默认参数要放到最后面
正确代码如下:
Plain Textclass Chinese:
def land_area(self,area):
print('我们居住的地方,陆地面积是%d万平方公里左右。'%area)
class Cantonese(Chinese):
# 为参数 area 设置默认值。
def land_area(self,c,a=960,b=0.0188):
Chinese.land_area(self, a*b*c)
yewen = Cantonese()
yewen.land_area(10)
Q2:TypeError: land_area() takes 2 positional arguments but 3 were given
自动检测class Chinese:
def land_area(self,area):
print('我们居住的地方,陆地面积是%d万平方公里左右。' % area)
class Cantonese(Chinese):
# 为参数 area 设置默认值。
def land_area(self,c,a=960,b=0.0188):
Chinese.land_area(self,a*b,c)
yewen = Cantonese()
yewen.land_area(10)
A2:父类Chinese原本的land_area方法中的参数只有area一个,所以当Chinese.land_area调用时,计算机发现父类Chinese的land_area方法和Chinese.land_area方法的参数数量不一致,所以会报错
正确代码:将第8行的,c去掉就可以了
(其实你会发现,这里没有c也是可以的,去掉c后,最后一行的括号里也不需要传参)
最后一问:进阶练习(李雷,韩梅梅)
回答:上面的系统答案给的,略微复杂,可以用下面的,好理解些:
这里的time最后没有调用到,所以父类方法里可以不用去计算self.time=hour这一列,加上也只是为了保证代码意思的完整。也不需要用到 =叠加,直接=也是可以的
自动检测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_effective = hour * rate
class Programmer(Student):
def __init__(self, name):
Student.__init__(self, name, job='programmer', time=0.00, time_effective=0.00)
#这里是类的继承和改写,去掉了初始化方法中的默认参数job,time,time_effective,然后为了简写代码,直接调用Student的初始化函数。去掉初始化方法中的默认参数后,在调用时则无法更改该默认参数,具体内容可回顾第9关函数内容。
def count_time(self, hour, rate=1):
Student.count_time(self, hour, rate)
#这里也是为了简写代码而直接调用类Student中的方法count_time。
student1 = Student('韩梅梅')
student2 = Programmer('李雷')
print(student1.job)
print(student2.job)
student1.count_time(10, 0.8)
student2.count_time(10)
print(student1.time_effective)
print(student2.time_effective)
类传递参数就一个思路
- 类如果有初始化函数,那么在类的实例化的时候,括号里的参数数量跟对应类的初始化函数括号里是一样的(除了self和默认参数)
比如
Plain Textdef __init__(self,变量1,变量2):
(具体的方法,一般是属性定义)
则实例化的时候就得:
实例名=类(参数1,参数2)
- 在调用类方法(函数)的时候,函数括号里有几个参数,那么调用的时候也传入对应数量的参数(self和默认参数除外)
比如:
Plain Textdef 普通函数名(self,变量1,变量2):
具体的执行方法
则调用就得:
实例名.类方法名(参数1,参数2)