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)