【问题标题】:How to modify the attribute of super class using subclass in python?如何在python中使用子类修改超类的属性?
【发布时间】:2020-12-04 22:03:12
【问题描述】:

我有一个类 Rectangle

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
        
    def set_width(self, width):
        self.width = width
        
    def set_height(self, height):
        self.height = height
        
    def get_area(self):
        return self.width * self.height
    
    def get_perimeter(self):
        return self.width*2 + self.height*2
    
    def get_diagonal(self):
        return (self.width ** 2 + self.height ** 2) ** .5
    
    def get_picture(self):
        picture = str()
        if self.width >= 50 | self.height >= 50:
            return "Too big for picture."
        
        for height in range(self.height):
            picture += "*"*self.width+"\n"
            
        return picture
    
    def __repr__(self):
        return f"Rectangle(width={self.width}, height={self.height})"

它的子类 Square

class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)
        self.length = length
    
    def set_side(self, length):
        super().__init__(length, length)
        self.length = length
    
    def set_width(self, length):
        super().__init__(length, length)
        self.length = length        
        
    def set_height(self, length):
        super().__init__(length, length)
        self.length = length
        
    def __repr__(self):
        return f"Square(side={self.length})"

每次我想改变值时,我都会调用 super()。init()。

我想要的不是在 Square 类中明确定义 set_height 和 set_width ,有没有一种方法可以通过调用 set side 将高度和宽度设置为 length 并且 str repr 也应该显示新的 set 边? 另外,我觉得有比我做的更好的方法来做到这一点。

【问题讨论】:

    标签: python class oop inheritance subclass


    【解决方案1】:

    这是一个类似的例子:

    class Rectangle : 
    
       def __init__(self,length,width):
            self.length = length 
            self.width = width  
           
    
    class Square(Rectangle) : 
        
       def __init__(self, length, width):
           super().__init__(length, width)  
    
       def area(self): 
           return self.length*self.width 
    
    
    class Cube(Rectangle): 
    
       def __init__(self,length, width,height):
           super().__init__(length, width)  
           self.height = height  
           
       def volume(self): 
           return self.length*self.width*self.height
    
    square = Square(3,3) 
    cube  = Cube(3,3,3) 
    
    print(square.area()) 
    print(cube.volume())
    

    【讨论】:

      【解决方案2】:

      所以,有趣的是,我现在正在与 freecodecamp 做同一个项目。然而,我走了一条与此不同的路线。您不必像那样将所有这些方法添加到子类中。您可以在 Square 类中定义边。我将分享我到目前为止所做的事情。现在这还远未完成。我喜欢降低功能,然后简化并使其更清洁。我正在研究 get_amount_inside() 方法,并且正在寻找如何从子类中提取属性以在超类中使用。

      class Rectangle:
      
          def __init__(self, width=None, height=None):
              self.height = height
              self.width = width
              self.area = None
              self.perimeter = None
              self.diagonal = None
              self.side = None
      
          def set_attributes(self, new_width=None, new_height=None):
              self.side = new_width or new_height
              self.width = new_width
              self.height = new_height
              return self.width, self.height
      
           def set_width(self, new_width):
              self.width = new_width
              return self.width
      
          def set_height(self, new_height):
              self.height = new_height
              return self.height
      
          def get_area(self):
              if self.side is not None:
                  self.area = (self.side ** 2)
                  return self.area
              else:
                  self.area = (self.width * self.height)
                  return self.area
      
          def get_perimeter(self):
              if self.side is not None:
                  self.perimeter = (self.side * 4)
                  self.perimeter = ((2 * self.height) + (2 * self.width))
                  return self.perimeter
              else:
                  self.perimeter = ((2 * self.height) + (2 * self.width))
                  return self.perimeter
      
          def get_diagonal(self):
              if self.side is not None:
                  self.diagonal = ((self.side ** 2) * 2) ** 0.5
                  return self.diagonal
              else:
                  self.diagonal = (self.height ** 2 + self.width ** 2)**0.5
                  return self.diagonal
      
          def __repr__(self):
              self.get_area()
              self.get_perimeter()
              self.get_diagonal()
              rectangle = ["Rectangle" + "(width=" + str(self.width), ", height=" + str(self.height) + ")"]
              return "".join(rectangle)
      
      
      class Square(Rectangle):
      
          def __init__(self, side):
              self.side = side
      
          def set_side(self, new_side):
              self.side = new_side
              return self.side
      
          def __repr__(self):
              square = ["Square" + "(side=" + str(self.side) + ")"]
              return "".join(square)
      

      我对这个项目的问题与你的完全不同。我完全忘记了 f"" 格式化方法,所以我很高兴我点击了这个链接。 -ZichKoding 是我在 Repl.it 上的名字

      【讨论】:

        【解决方案3】:
            class Rectangle:
                def __init__(self, width, height):
                    self.width = width
                    self.height = height
                    
                def set_width(self, width):
                    self.width = width
                    
                def set_height(self, height):
                    self.height = height
                    
                def get_area(self):
                    return self.width * self.height
                
                def get_perimeter(self):
                    return self.width*2 + self.height*2
                
                def get_diagonal(self):
                    return (self.width ** 2 + self.height ** 2) ** .5
                
                def get_picture(self):
                    picture = str()
                    if self.width >= 50 | self.height >= 50:
                        return "Too big for picture."
                    
                    for height in range(self.height):
                        picture += "*"*self.width+"\n"
                        
                    return picture
                
                def __repr__(self):
                    return f"Rectangle(width={self.width}, height={self.height})"
            
            
            
            class Square(Rectangle):
                def __init__(self, length):
                    super().__init__(length, length)
                    self.length = length
                
                def set_side(self, length):
                    super().__init__(length, length)
                    self.length = length
                
                def set_width(self, length):
                    # super().__init__(length, length)
                    # self.length = length     
                    self.set_side(length)   
                    
                def set_height(self, length):
                    # super().__init__(length, length)
                    # self.length = length
                    self.set_side(length)   
            
                    
                def __repr__(self):
                    return f"Square(side={self.length})"
            
            
            
            # r = Rectangle(20, 20)
            s = Square(20)
            
            # print(r)
            print(s)
            s.set_width(60)
            print(s)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-12-12
          • 1970-01-01
          • 2021-03-13
          • 1970-01-01
          • 2011-02-13
          • 2017-04-18
          • 1970-01-01
          相关资源
          最近更新 更多