• 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
    第五题
    为什么要坚持,想一想当初!
  • 相关阅读:
    尝试用微博记录 SQL Server 2012开发者训练营笔记
    Contact Manager Web API 示例[4] 异常处理(Exception Handling)
    使用IAPIExplorer列举ASP.NET Web API
    从 WebAPI Beta 更新到WebAPI RC
    Tracing in ASP.NET Web API
    一个基于asp.net2.0空间的webproxy程序:ASProxy
    微软发布平板电脑 – Surface
    Big Data, Hadoop and StreamInsight™
    REST 入门介绍
    通过企业分布式缓存共享运行时数据
  • 原文地址:https://www.cnblogs.com/JerryZao/p/9655342.html
Copyright © 2020-2023  润新知