Python-面向对象练习1

1、随机数生成类:

思路:
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 <= 10 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 < 10:
66             self.patch = count
67         return next(self._gen)
68 
69 t = RandomGen()
70 print(t.generate())
71 print(t.generate(5))
多种参考

2、打印坐标,利用上题的结果,两两配对,打印出来,扩展,求两点之间的距离:

思路:
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 0x0000000002122160>, <__main__.Point object at 0x0000000002226C50>, <__main__.Point object at 0x0000000002948048>, <__main__.Point object at 0x0000000002948400>, <__main__.Point object at 0x0000000002948320>]
13 for p in points:
14     print(p.x, p.y)
第二题

 3、记录车的品牌,颜色,价格,速度等信息,实现增加车辆信息,并输出所有车辆信息

思路:
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 0x0000000002998710>
25 print(c1.getall())
第三题

4、温度转换:华氏, 摄氏,开氏温度之间的相互转换:

 思路:

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)
第四题

5、模拟购物车购物:

思想:

  1. 购物车购物,分解得到两个对象,购物车,物品,一个操作购买
  2. 购买不是购物车的行为,其实是人的行为,但是对于购物车来说就是增加add
  3. 商品有很多种类,商品的属性多种多样,怎么解决?
  4. 购物车可以加入很多不同的商品,如何实现?

 

  参考代码:

 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
第五题

猜你喜欢

转载自www.cnblogs.com/JerryZao/p/9655342.html