【问题标题】:Is it impossible to reduce the arguments needed for Child Class compared to its Parent class?与父类相比,是否不可能减少子类所需的参数?
【发布时间】:2021-02-28 19:17:42
【问题描述】:

这是我在这里的第一篇文章,我是 python 新手,很想学习。我希望我在这里的帖子对每个人都足够清楚。

有没有人知道是否可以从父类的继承中减少子类所需的参数?

示例如下:

# this is a code to estimate any polygon's perimeter (parent)
# the second one is code to estimate a square's area (child)

    class RegularPolygon:
    `def __init__(self, 
                 no_of_sides=0, 
                 side_length=0):`
        `self.no_of_sides = no_of_sides`
        `self.side_length = side_length`
        
    `def perimeter(self):`
        `perimeter =  self.no_of_sides * self.side_length`
        `return perimeter`

    `class Square(RegularPolygon):`
        `def __init__(self, 
                 no_of_sides=4, 
                 side_length=0):`
            `super().__init__(no_of_sides, side_length)`   
        
        `def area(self):`
            `area = self.side_length ** 2`
            `return area`

我正在尝试调用子类并估计平方。因为它是一个正方形,所以它总是有 4 个边,所以 no_of_sides = 总是 4。我正在考虑让它自动化,因此我可以只用一个参数调用类 Square。

这是我对他们的期望:

    `item = Square(5)`
    `item.area()`
>>> 20
    `item.perimeter()`
>>>20

我尝试为他们的论点(父母、孩子、父母和孩子)赋予基本价值,但仍然总是得到错误的结果。 到底有没有?

【问题讨论】:

    标签: python python-3.x class arguments parent-child


    【解决方案1】:

    每个类的构造函数都可以有你想要的任何签名;只需确保孩子使用适当的参数调用父母即可。

    class RegularPolygon:
        def __init__(self, no_of_sides, side_length):
            self.no_of_sides = no_of_sides
            self.side_length = side_length
        
        def perimeter(self):
            return self.no_of_sides * self.side_length
    
    
    class Square(RegularPolygon):
        def __init__(self, side_length):
            RegularPolygon.__init__(self, 4, side_length)
    

    【讨论】:

    • 嗨,我试过用这个,效果很好!谢谢你。顺便说一句,这里的关键是什么?是类子下的RegularPolygon.__init__(self, 4, side_length) 行吗?在不询问第 2 行的边数的情况下,我可以附加其父级所需的构造函数。我说的对吗?
    • 是的,RegularPolygon.__init__() 是父类的构造函数。您可以改用super().__init__,但是当您需要将特定参数传递给特定构造函数时,IMO 只需指定您的意思就不会那么混乱(如果出现这种情况,以这种方式处理多重继承要容易得多)。
    【解决方案2】:

    在这种情况下,最好完全删除那些 __init__ 参数。

    您的 Square 类只需要接受它需要的参数 (side_length),而不是让该类的用户覆盖 no_of_sides 的 4。

    class Square(RegularPolygon):
       def __init__(self, side_length):
          super().__init__(no_of_sides=4, side_length=side_length)
    

    【讨论】:

    • 嗨,我刚才尝试了这个建议,但我得到了这个。文件“”,第 16 行 super().__init__(no_of_sides=4, side_length) ^ 语法错误:位置参数跟在关键字参数之后。我一直在尝试组合类似的东西,但以前也经常遇到这个错误。
    • @RG182 你需要做(no_of_sides=4, side_length=side_length)。在您的评论中,您有一个位置参数 (side_length),它跟在关键字 (no_of_sides=4) 之后
    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2021-12-14
    相关资源
    最近更新 更多