Python-面向对象练习1
Posted JerryZao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、模拟购物车购物:
思想:
- 购物车购物,分解得到两个对象,购物车,物品,一个操作购买
- 购买不是购物车的行为,其实是人的行为,但是对于购物车来说就是增加add
- 商品有很多种类,商品的属性多种多样,怎么解决?
- 购物车可以加入很多不同的商品,如何实现?
参考代码:
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
以上是关于Python-面向对象练习1的主要内容,如果未能解决你的问题,请参考以下文章