• hausaufgabe--python 38 -- extends of Class


    00-- requirements 

    a. to define a class of Point and a class of Line with Point as parent

    b. define a function in Line to calculate the lenth of 2 points. 

    import math
    
    class Point:
        def __init__(self,x,y):
            self.x = x
            self.y = y
    
            return (self.x, self.y)
    
    class Line(Point):
        def __init__(self,x1,y1,x2,y2):
            self.point1 = Point.__init__(self,x1,y1)
            self.point2 = Point.__init__(self,x2,y2)
        
    
    
        def getLen(self):
            return math.hypot((self.point1[0]-self.point2[0]),(self.point1[1]-self.point2[1]))

    PS:

    with extend, there are 2 ways to redefine the functions in parent class, e.g. the __init__(self) function in Point

    with extent, Line can reuse the __init__(self) in Point as below:

    1-- 

    Point.__init__(self)

    2--

    super().__init__()

    Be careful, when you use the second way with super(), don't add "self" as prameter anymore. 

    class Line(Point):
        def __init__(self,x1,y1,x2,y2):
            self.point1 = super().__init__(x1,y1)
            self.point2 = super().__init__(x2,y2)

    If I add with self, when running, the error will be shown as below:

    >>> l = Line(1,2,3,4)
    Traceback (most recent call last):
      File "<pyshell#42>", line 1, in <module>
        l = Line(1,2,3,4)
      File "C:/其他应用/python/Lib/idlelib/extendtest.py", line 12, in __init__
        self.point1 = super().__init__(self,x1,y1)
    TypeError: __init__() takes 3 positional arguments but 4 were given

    001-- __init__(self) function in class

    __init__(self) function is used to define the attributes of the class, it won't return other things except None. 

    e.g. 

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

    with running, it will show :

    >>> myClass = MyClass()
    Traceback (most recent call last):
    File "<pyshell#13>", line 1, in <module>
    myClass = MyClass()
    TypeError: __init__() should return None, not 'str'

    002-- multiple extends 

    It might caused some unknow serious issues. 

    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…")

    Running result:

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

    As you can see, class A have been init 2 times. 

    To avoid this, please use super() for the init, or avoid multiple extends cases. 

    referred:

    http://bbs.fishc.com/thread-48759-1-1.html

  • 相关阅读:
    第01组 Beta冲刺(5/5)
    第01组 Beta冲刺(4/5)
    第01组 Beta冲刺(3/5)
    第01组 Beta冲刺(2/5)
    第01组 Beta冲刺(1/5)
    2019 SDN上机第6次作业
    SDN课程阅读作业(2)
    2019 SDN上机第5次作业
    第01组 Alpha事后诸葛亮
    第01组 Alpha冲刺(6/6)
  • 原文地址:https://www.cnblogs.com/Shareishappy/p/7491818.html
Copyright © 2020-2023  润新知