效果实现了,但感觉很麻烦,并且有的没有用到

效果实现了,但感觉很麻烦,并且有的没有用到

http://img1.sycdn.imooc.com//climg/5daec63509af920418461424.jpg

1中定义的语句中print没有用到

2和4中实现效果图中的花括号“{}”很麻烦

3中知识点上课没有讲过,只是提到了两个父类中,如果定义一样的只会实现其一,没有讲解决办法,我也是瞎搞搞出来的

以上是我的问题,请帮忙优化下,谢谢。

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学,你好。

1、在2和4中,实现花括号效果可以使用字符串拼接的形式

2、Rectangle()继承两个类,在调用父类时,可以用父类.方法()的形式来调用继承的父类中的__init__()方法。

同学可以参考下述代码进行优化:

class Point(object):
    
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def string(self):
        return "{X:" + str(self.x) + ", Y:" + str(self.y) + "}"

class Circle(Point):
    
    def __init__(self, x, y, radius):
        super().__init__(x, y)
        self.radius = radius
    def string(self):
        return "该图形初始化点为:" + super().string() + "; {半径为:" + str(self.radius) + "}"

class Size(object):
    def __init__(self, width, height):
        self.width = width
        self.height = height
        
    def string(self):
        return "{Width: " + str(self.width) + ", Height: " + str(self.height) + "}"

class Rectangle(Point, Size):

    def __init__(self, x, y, width, height):
        Point.__init__(self, x, y)
        Size.__init__(self, width, height)

    def string(self):
         return "该图形初始化点为:" + Point.string(self) + ";" \
                  " 长宽分别为:" + Size.string(self)

if __name__ == "__main__":
    c = Circle(5, 5, 8)
    print(c.string())

    r1 = Rectangle(15, 15, 15, 15)
    print(r1.string())

    r2 = Rectangle(40, 30, 11, 14)
    print(r2.string())

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

  • 唐珩溢 提问者 #1
    第一format没有转义符么,像Linux中用‘\’,这里只能拼接是么 第二Point.__init__这里,我的定义方法调用父类用的super,但是两个调用,一个需为父类,一类需为祖宗父类,两个都用父类super(Point,...)和super(Size,...)就会报错object.__init__() takes exactly one argument (the instance to initialize) 只接收一个参数,求解
    2019-10-23 01:37:30
好帮手慕美 2019-10-23 16:27:15

同学,你好。

1、Point.__init__()跟super(Point,self).__init__()不是等价的。Point.__init__()是调用Point类中的init方法。super(Point,self).__init__()是调用Point的父类object的init方法。

因为Rectangle()类继承了Point和Size父类,又因这两个父类继承了object类,相当于Rectangle()类有三个父类,在执行super(Point,self).__init__()时,object类中的init是没有参数的,x和y参数是传递不过去的,因此会在Size()类中查找,会输出结果,即width和height。

2、若使用super(Point,self).__init__()和super(Size,self).__init__()的话,继承的是这两个子类的父类即object()中的__init__()方法,因为object中有init方法,则不会执行子类中的init方法。又因object类的init方法中没有参数,因此在传参的时候会报错。

http://img1.sycdn.imooc.com//climg/5db008b509cbaa2508500116.jpg3、Point.__init__()和Size.__init__()是使用类名调用方法,会直接执行相应类中的init方法进行初始化。

  • 提问者 唐珩溢 #1
    请看清楚我的代码用的是 super(Point, self).__init__(x, y) super(Rectangle, self).__init__(width, height) , 而并不是 super(Point, self).__init__(x, y) super(Size, self).__init__(width, height) , 或者请直接看我最开始问问题发的图片,标着数字三的位置
    2019-10-23 17:01:14
  • 好帮手慕美 回复 提问者 唐珩溢 #2
    同学,你好。知道同学使用的是super(Point, self).__init__(x, y) super(Rectangle, self).__init__(width, height)的形式实现的效果。但同学在回复中问了使用super(Point,...)和super(Size,...)会报错,在回答中解释了报错的原因。祝学习愉快~~~~
    2019-10-23 18:25:50
好帮手慕美 2019-10-23 09:56:02

同学,你好。

1、同学string()方法中是要使用format实现效果吗?当使用format格式化时,字符串中需要使用大括号时可以使用大括号进行转义,即再添加一层大括号嵌套。

例:

http://img1.sycdn.imooc.com//climg/5dafb1ef097eb2c309870238.jpg

2、Rectangle()继承两个类,在调用两个父类中的方法时,不能使用super()调用。因为在使用super( )进行父类调用时期主要用途是为了防止父类中的方法被多次调用,而本案例中使用super( )调用时x,y参数可以被传递至Point类中,而width,height参数没有任何类来进行传递和接收,因此width参数没有被Size类接收。

解决办法:Rectangle类继承两个父类,可以用父类.方法()的形式来调用继承的父类中的__init__()方法。

http://img1.sycdn.imooc.com//climg/5dafb2ed09734a7a04980136.jpg

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

  • 提问者 唐珩溢 #1
    super(Point, self).__init__(x, y) super(Rectangle, self).__init__(width, height) 我的是这么写的,也实现了 这里的Point.__init__跟super(Point,self)是等价的么 回复上一个人的时候,我还问了,super需要一个用Point,一个用Rectangle,为什么不能像Point.__init__和Size.__init__这样使用
    2019-10-23 10:10:14
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师