小甲鱼第三十八课:类和对象:继承总结反思

1.如果按以下方式重写魔法方法__ init__,结果会怎样?

>>> class MyClass:
    def __init__(self):
        return "I love FishC.com!"

会报错,因为初始化只返回none,其他的都错误
5. 多重继承使用不当会导致重复调用(也叫钻石继承、菱形继承)的问题,请分析以下代码在实际编程中有可能导致什么问题?

class A():
    def __init__(self):
        print("进入A...")
        print("离开A...")

class B(A):
    def __init__(self):
        print("进入B...")
        A.__init__(self)
        print("离开B...")

class C(A):
    def __init__(self):
        print("进入C...")
        A.__init__(self)
        print("离开C...")

class D(B, C):
    def __init__(self):
        print("进入D...")
        B.__init__(self)
        C.__init__(self)
        print("离开D...")

d = D()

答:输出如下:

进入D...
进入B...
进入A...
离开A...
离开B...
进入C...
进入A...
离开A...
离开C...
离开D...

为啥会这样呢,其实可以先了解钻石继承的机制:
在这里插入图片描述
程序会从左至由依次循环到底,所以出现了d-b-a-a-b再是c-a-a-c-d的情况
而加入super后,会变成一层一层进然后在出所以改为如下代码结果就是理想的

class A():
    def __init__(self):
        print("进入A...")
        print("离开A...")

class B(A):
    def __init__(self):
        print("进入B...")
        super().__init__()
        print("离开B...")

class C(A):
    def __init__(self):
        print("进入C...")
        super().__init__()
        print("离开C...")

class D(B, C):
    def __init__(self):
        print("进入D...")
        super().__init__()
        print("离开D...")

d = D()
进入D...
进入B...
进入C...
进入A...
离开A...
离开C...
离开B...
离开D...

编程题
0.定义一个点(Point)类和直线(Line)类,使用getLen方法可以获得直线的长度。
提示:
1️⃣设点A(X1,Y1)、B(X2,Y2),则两点构成的直线长度为|AB| = √(X1-X2)^2 + (Y1-Y2)^2
2️⃣Python中计算开根号可使用math模块中的sqrt函数
3️⃣直线需有两点构成,因此初始化时需要有两个点(Point)对象作为参数

自己的代码

import math as m
class Point:
    def __init__(self):
        print('请输入x1的点坐标:',end = '')
        self.x1 = float(input())
        print('请输入y1的点坐标:',end = '')
        self.y1 = float(input())
        print('请输入x2的点坐标:',end = '')
        self.x2 = float(input())
        print('请输入y2的点坐标:',end = '')
        self.y2 = float(input())
        print('A坐标是:',(self.x1,self.y1))
        print('B坐标是:',(self.x2,self.y2))
         
class Line(Point):
    def __init__(self):
        super().__init__()
    def getLen(self):
        L = m.sqrt((self.x1+self.x2)**2)+m.sqrt((self.x2+self.y2)**2)
        print('AB的长度为:%.2f'%L)
AB = Line()
L = AB.getLen()

可以改进的地方:利用形参可以做到将点分开输入和操作的功能

import math as m
class Point:
    def __init__(self,x=0,y=0):
        self.x = x
        self.y = y
#这一步做到了当定义两个不同的点时,可以直接初始化改变
    def GetX(self):
        return self.x
    def GetY(self):
        return self.y
        
class Line:
    def __init__(self,p1,p2):
    #注意这里这么做的原因是p1,p2都是实例化的Point的对象,这样就可以区分两个点的x和y(见最后p1,p2)
        self.x = p1.GetX()- p2.GetX()
        self.y = p1.GetY()- p2.GetY()
        #所以这里可以p1.GetX,因为p1已经被实例化
    def GetLen(self):
        L = m.sqrt(self.x * self.x + self.y * self.y)
        print('AB的长度为:%.2f'%L)
p1 = Point(1,4)
p2 = Point(1,1)
line = Line(p1,p2)
AB = line.GetLen()

这个题主要就难在获取两个点x,y的值并进行运算,所以运用形参,在point的作用是输入x,y的值,而在line的作用是用p1p2来对象化每个点,然后在定义了提取x和y的函数,从而达到了自由提取xy的值并计算输出
!!!!重点,形参的作用!且形参注意初始赋值


还要注意的是

self.x = p1.GetX()- p2.GetX()
self.y = p1.GetY()- p2.GetY()

其实self.x千万别和上面的混淆,我可以改成self.ab1,只要将后面变量一致就行。
self.变量名的作用其实就是将值赋给变量。而self只是起一个统一地址的作用,这样可以实现多用户进行使用。

同时还有一种结构是
self.变量 = 类(形参)
相当于意思就是将变量当成是类的对象,此时如果要引用类中的函数
则:
self.变量.函数()

那为什么这道题能不能直接将类实例化呢?
因为p1.GetX()中p1是point实例化的对象,所以可以将p1改为self.ab1
见下:

import math as m
class Point:
    def __init__(self,x=0,y=0):
        self.x = x
        self.y = y
#这一步做到了当定义两个不同的点时,可以直接初始化改变
    def GetX(self):
        return self.x
    def GetY(self):
        return self.y
        
class Line:
    def __init__(self):
    #这里定义了point的实例化,并且可以根据最终定义Line的实例化的对象变换self
        self.A= Point(1,4)
        self.B =Point(1,1)
        self.ab1 = self.A.GetX()- self.B.GetX()
        self.ab2 = self.A.GetY()- self.B.GetY()
        
    def GetLen(self):
        L = m.sqrt(self.ab1 * self.ab1 + self.ab2 * self.ab2)
        print('AB的长度为:%.2f'%L)
#这里就少了p1p2,但是这样的问题是无法随意变换两个点的值
line = Line()
AB = line.GetLen()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值