Q1:这里A继承了B,是继承了B什么? ![](http://image109.360doc.com/DownloadImg/2020/08/2022/199835642_1_20200820104836770)
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的。 ![](http://image109.360doc.com/DownloadImg/2020/08/2022/199835642_3_20200820104836895)
Q3:为什么'广东'传给了hometown?——#出生地:广东 练习 ![](http://image109.360doc.com/DownloadImg/2020/08/2022/199835642_4_20200820104836989)
A3:因为你初始化函数的时候设定了一个参数,所以实例化的时候是传给它的(可以看下助教画的传参步骤) ![](http://image109.360doc.com/DownloadImg/2020/08/2022/199835642_5_20200820104837130)
Q4:这里写pass和不写的区别是什么?——#眼睛、吃饭用筷子练习 ![](http://image109.360doc.com/DownloadImg/2020/08/2022/199835642_6_20200820104837270)
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后,最后一行的括号里也不需要传参) 最后一问:进阶练习(李雷,韩梅梅) ![](http://image109.360doc.com/DownloadImg/2020/08/2022/199835642_7_20200820104837333)
回答:上面的系统答案给的,略微复杂,可以用下面的,好理解些: 这里的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)
|