python---面向对象7--类的继承、重写、super方法
1 # 创建一个类 2 class Point: 3 """ 4 表示平面坐标系里的一个点 5 """ 6 name = '点' # 类属性 7 8 # 魔术/特殊方法,有特殊功能的方法,都以双下划线开头 9 # __init__, 初始化方法,构造方法,对象属性一般定义在这里 10 # 当创建对象的时候它会被自动调用,创建对的对象会被传递给第一个参数 11 # 会接受类名括号里传入的参数(从第二个参数开始传 ) 12 def __init__(self, x, y): 13 print('我执行了这一段初始化代码') 14 self.x = x 15 self.y = y 16 17 # __str__ 18 # 定义对象被print的时候的字符串形式 19 # print一个对象的时候,实际上会调用这个对象的__str__方法,打印这个方法的返回值 20 def __str__(self): 21 return '({}, {})'.format(self.x, self.y) 22 23 # 定义在类里的普通函数就是对象方法 24 def my_point(self): 25 print('({}, {})'.format(self.x, self.y)) 26 27 # 两点之间的距离 28 def distance(self, p2): 29 return ((self.x - p2.x) ** 2 + (self.y - p2.y) ** 2) ** 0.5 30 31 # 类方法 32 # 在类中通过装饰器classmethod可以把一个函数定义为类方法 33 # 给Point类定义一个类方法,用来返回坐标原点 34 @classmethod 35 def base_point(cls): 36 bp = cls(0, 0) 37 return bp 38 39 # 静态方法 40 # 在类中通过staticmethod可以把一个函数定义为静态方法 41 # 静态方法不会接受隐式的第一个函数,它和普通函数一样,只是被封装到类里 42 # 通过类或是对象都可以调用 43 @staticmethod 44 def sum(x, y): 45 return x + y 46 47 48 # 类的继承 49 # 从现有的类继承,新的类称为子类(subclass) 50 # 被继承的类称为父类/基类/超类 51 # 子类可以继承父类的属性和方法 52 # 创建一个类,来表示三维里的点 53 class TdPoint(Point): # 继承只需要把父类放到子类中 54 """ 55 表示三维的点 56 """ 57 58 59 # print(dir(TdPoint)) 60 # print(TdPoint.name) 61 # print(TdPoint.base_point()) 62 # print(TdPoint.sum(1, 2)) 63 64 65 # 类的重写 66 # 在子类中定义同名的方法和属性会覆盖父类的方法和属性 67 class TdPoint2(Point): 68 """ 69 表示三维的点 70 """ 71 def __init__(self, x, y, z): 72 self.x = x 73 self.y = y 74 self.z = z 75 76 def __str__(self): 77 return '({}, {}, {})'.format(self.x, self.y, self.z) 78 79 80 # tp = TdPoint2(1, 2, 3) 81 # print(tp) 82 83 84 # super方法 85 # 重写了父类的方法,但是又要调用父类的方法 86 # 例如:三维点在计算点和点的距离时,还要求同时返回这个点投射到二维平面的距离 87 class TdPoint3(Point): 88 """ 89 表示三维的点 90 """ 91 def __init__(self, x, y, z): 92 self.x = x 93 self.y = y 94 self.z = z 95 96 def __str__(self): 97 return '({}, {}, {})'.format(self.x, self.y, self.z) 98 99 def distance(self, p2): 100 # ds_2 = ((self.x - p2.x) ** 2 + (self.y - p2.y) ** 2) ** 0.5 101 # ds_2 = Point.distance(self, p2) 102 ds_2 = super().distance(p2) 103 ds_3 = ((self.x - p2.x) ** 2 + (self.y - p2.y) ** 2 + (self.z - p2.z) ** 2) ** 0.5 104 return ds_2, ds_3 105 106 107 tp1 = TdPoint3(1, 2, 3) 108 tp2 = TdPoint3(2, 3, 4) 109 res = tp1.distance(tp2) 110 print(res)