Python-面向对象练习1
2021-06-26 20:03
标签:form 比较 技术 而不是 问题 区别 png 参数 生成 1、随机数生成类: 参考代码: 2、打印坐标,利用上题的结果,两两配对,打印出来,扩展,求两点之间的距离: 参考代码: 3、记录车的品牌,颜色,价格,速度等信息,实现增加车辆信息,并输出所有车辆信息 参考代码: 4、温度转换:华氏, 摄氏,开氏温度之间的相互转换: 思路: 5、模拟购物车购物: 思想: 参考代码: Python-面向对象练习1 标签:form 比较 技术 而不是 问题 区别 png 参数 生成 原文地址:https://www.cnblogs.com/JerryZao/p/9655342.html思路:
1、考虑实例化,将这些参数传给具体的实例,这是最普的写法
2、生成是一个工具类,只用来提供功能 ---这种要好好考虑
3、因为是一个生成问题,可以使用生成器
4、生成器返回的只是格式,参数还是会根据具体情况改变的 1 # # 常规类实现:
2 import random
3
4 class RandomGen:
5 def __init__(self, start=1, stop=10, patch=10):
6 self.start = start
7 self.stop = stop
8 self.patch = 10
9
10 def generate(self):
11 return [random.randint(self.start, self.stop) for _ in range(self.patch)]
12
13 # 作为工具类来实现,提供方法
14 class RandomGen:
15 @classmethod
16 def generate(cls,start=1, stop=100, patch=10):
17 return [random.randint(start, stop) for _ in range(patch)]
18
19 print(RandomGen.generate())
20 # 作为工具类的生成器类型:
21 class RandomGen:
22 @classmethod
23 def generate(cls,start=1, stop=100, patch=10):
24 while True:
25 yield [random.randint(start, stop) for _ in range(patch)]
26
27 for _ in range(3):
28 print(next(RandomGen.generate()))
29
30
31 # 普通类 的生成器 类型:
32 class RandomGen:
33 def __init__(self, start=1, stop=100, patch=10):
34 self.start = start
35 self.stop = stop
36 self.patch = patch
37 self._gen = self._generate()
38
39 def _generate(self):
40 while True:
41 yield random.randint(self.start, self.stop)
42
43 def generate(self, count=10):
44 patch = self.patch if count else count
45 return [next(self._gen) for _ in range(patch)]
46
47 t = RandomGen()
48 print(t.generate())
49
50
51 print("---" * 40)
52 #
53 class RandomGen:
54 def __init__(self, start=1, stop=100, patch=10):
55 self.start = start
56 self.stop = stop
57 self.patch = patch
58 self._gen = self._generate()
59
60 def _generate(self):
61 while True:
62 yield [random.randint(self.start, self.stop) for _ in range(self.patch)]
63
64 def generate(self, count=10):
65 if count :
66 self.patch = count
67 return next(self._gen)
68
69 t = RandomGen()
70 print(t.generate())
71 print(t.generate(5))
思路:
1、可以设计一个坐标类,用来放着写坐标,以便以后用这些坐标计算,比如距离
2、两两配对,首选zip()方法
3、尽量找到参与方,封装出类来。如果写出来的东西根函数没有什么区别,那就不是面向对象,要多想想
4、求两点之间的距离----实现 1 import math
2 class Point:
3 def __init__(self, x, y):
4 self.x = x
5 self.y = y
6
7 def distance(self, p): # 求两点之间的距离
8 dis = math.sqrt(abs(self.y - p.y) ** 2 + abs(self.x - p.x) ** 2)
9 return dis
10
11 points = [Point(x, y) for x, y in zip(range(5), range(5))]
12 print(points) # [<__main__.point object at>, <__main__.point object at>, <__main__.point object at>, <__main__.point object at>, <__main__.point object at>]
13 for p in points:
14 print(p.x, p.y)
思路:
1、增加车的信息,是类的功能,而不是车的功能,车可以显示自己的信息
2、使用filter 过滤掉不可以显示的内容,__dict__
3、获取所有车的信息,要提供参数,否则一下子把之前的所有的车的信息都显示了,比如:注册时间,等,用来过滤
类似的额,只要get_all 这样的额,返回数据比较多的,一般都要过滤,或者一批一批显示
4、往往都是yield,一批一批显示
5、并不是所有的类都需要实例化,像CarInfo,只需要Car的实例的信息,最终显示的是所有车的信息,只需要一个类方法下来显示即可
6、比如 三个车辆管理中心,可以联网,就可以值用一个类变量,如果没联网,可以只显示自己管辖区的 1 class Car:
2 def __init__(self, color, mark , price, speed):
3 self.color = color
4 self.mark = mark
5 self.price = price
6 self.speed = speed
7 def getcarinfo(self):
8 return self.__dict__
9 def __repr__(self):
10 return ‘‘.format(type(self).__name__, self.mark,
11 self.color, self.price, self.speed)
12 class CarInfo:
13 # info = []
14 def __init__(self):
15 self.info = []
16 def addcar(self, car:Car):
17 self.info.append(car)
18 def getall(self):
19 return self.info
20 car1 = Car(‘red‘, ‘QQ‘, 20, 20)
21 # print(car1.getcarinfo())
22 c1 = CarInfo()
23 c1.addcar(car1)
24 print(car1) # <__main__.car object at>
25 print(c1.getall())
1、可能用到的值,先求出来,的用到时,直接给 或者, 先不求,等用到的时候,在求,再提供
2、因为常用到的是摄氏度,所以以摄氏度为中心,转换为其他的单位
3、既能当工具,追踪某种温度的转换,-----又能做转换,一下子全部返回
4、所以这个类设计的像一个工具类:
温度转换可以使用实例的方法,也可以使用类的方法,使用类方法的原因是,为了不创建对象,就可以直接换算
参考代码: 1 #像这样的思路是完成了一个 不仅仅只转换一个温度
2 # 比如只需要c2f ,通过类调用c2f 方法即可
3 # 如果需要 37摄氏度对应的其他所有温度,可以实例调用属性获取
4 # 此外,需要什么温度,算出什么温度,而不是,传入温度,都算出来
5 class Temparture:
6 def __init__(self, t, unit=‘c‘):
7 self._c = None
8 self._f = None
9 self._k = None
10 # 因为一般使用摄氏度的时候多,所以将传进来的温度,都转换为摄氏度
11 if unit == ‘f‘:
12 self._f = t
13 self._c = self.f2c(t)
14 elif unit == ‘k‘:
15 self._k = t
16 self._c = self.k2c(t)
17 else:
18 self._c = t
19 #通过属性装饰器,调用保护变量,而且需要的时候才计算
20 @property
21 def c(self):
22 return self._c
23 @property
24 def f(self):
25 if self._f == None:
26 self._f = self.c2f(self._c)
27 return self._f
28 @property
29 def k(self):
30 if self._k == None:
31 self._k = self.c2k(self._c)
32 return self._k
33
34 @classmethod
35 def c2f(cls, c):
36 return 9 * c / 5 + 32
37 @classmethod
38 def f2c(cls, f):
39 return 5 * (f - 32) / 9
40 @classmethod
41 def c2k(cls, c):
42 return c + 273.15
43 @classmethod
44 def k2c(cls, k):
45 return k - 273.15
46 @classmethod
47 def f2k(cls, f):
48 return cls.c2k(cls.f2c(f))
49 @classmethod
50 def k2f(cls, k):
51 return cls.c2f(cls.k2c(k))
52
53 print(Temparture.c2f(40))
54
55 t = Temparture(37)
56 print(t.c, t.k, t.f)
57
58
59 t = Temparture(37, ‘k‘)
60 print(t.c, t.k, t.f)
1 class Color:
2 RED = 0
3 BLUE = 1
4 GREEN = 2
5 OTHER = 1000
6
7 # 货物类
8 class Item:
9 def __init__(self, mark, price, **kwargs):
10 self.mark = mark
11 self.price = price
12 self.__dict__.update(kwargs)
13
14 def __repr__(self):
15 return str(sorted(self.__dict__))
16
17 class Cart:
18 def __init__(self):
19 self.items = []
20
21 def additem(self, item:Item):
22 self.items.append(item)
23
24 def getallitems(self):
25 return self.items