分享

第13关易错点讲解(常见问题解答)

 高弗 2020-08-20

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 Text
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)

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 Text
def __init__(self,变量1,变量2):
(具体的方法,一般是属性定义)

则实例化的时候就得:

实例名=类(参数1,参数2)

  • 在调用类方法(函数)的时候,函数括号里有几个参数,那么调用的时候也传入对应数量的参数(self和默认参数除外)

比如:

Plain Text
def 普通函数名(self,变量1,变量2):
具体的执行方法

则调用就得:

实例名.类方法名(参数1,参数2)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多