2019/11/11 01-习题随机数生成、坐标打印、车辆管理类

在这里插入图片描述在这里插入图片描述
随机生成整数有动作,需要给你方法,调用方法说生成整数
start开始,stop停止,patch一批有多少个
用一个类可以用一个实例暂时把对象的属性和操作保存起来,用的时候通过实例要属性,这时候传参可以不传了
在这里插入图片描述
下面就可以,先产生一个对象,
然后rg.generate 实例调用
在这里插入图片描述
可以理解为生成这个东西是个工具类
在这里插入图片描述
工具就相当于math这样的东西,属于工具模块,无非就通过这个模块管理这个函数
下面两种思路都是可以的

在这里插入图片描述
一上来先考虑类,把这样的数据交给类来处理,类里的方法可以用这些数据得到你想要的数据,这是一种工具类的思想
在这里插入图片描述

普通的写法,把数据保存起来,用的时候再说在这里插入图片描述
这两种方法的思路出发是不一样的,一个是常用的封装类方式,另一种是这种方法就是用来产生数据的

如果写成staticmethod,要清楚本质是什么,staticmethod,类,self都不要,只关心传什么形参就可以了
缺省值的好处就是能给别人省一点就省一点,也不一定会用所有参数

在这里插入图片描述
能不能把上面也写成classmethod,cls就不能用self,类方法不能调用实例的属性,因为有可能实例并不存在就开始调用了
在这里插入图片描述
不要这么做,所以往往类方法,静态方法,这些都是来自于工具,不需要实例的属性
在这里插入图片描述
是否可以写成生成器的版本,yield
生成随机数据 random.randint(self.start,self.stop)
下面就是一批指定几个数字

在这里插入图片描述
想从里面拿,控制拿几次
yield列表出去和return 列表出去是有差异的
定义完初始化,初始化后实例化,实例构造之前这个函数就已经有了,是可以调用的
这个得到的结果是个生成器对象,生成器对相赋值给一个gen

在这里插入图片描述
这个得到的结果是个生成器对象,生成器对相赋值给一个gen,在下面使用变量在这里插入图片描述
首先得到一个所谓的对象,现在类对象有,函数对象有,函数对象被类对象管理起来了,
下面做实例化和初始化的过程
调用init,把start ,stop赋值
之后先计算右边,self._generate()生成器对象调用,要使用,就拨一下转一下,
现在就执行了上部分

在这里插入图片描述
现在这个实例就塞了上面的4个属性
在这里插入图片描述
现在需要使用,传入self,然后按照迭代次数,迭代,每一次都问同一个生成器对象要数据,产生的数据用列表封装就返回给你
在这里插入图片描述在这里插入图片描述
能不能这么做,接着上面的重新写,一次yield一批,之前是依次yield一个,攒一批
拨这一下正好返回一批,拨一下返回一个列表

在这里插入图片描述
执行一下没有问题
在这里插入图片描述
这边修改,改成5个,一旦实例造成之后,生成器对象就定性了,相当于下面的函数已经生成了一个生成器对象了在这里插入图片描述
现在能不能对已经存在的生成器对象进行修改,每一次调用是对上一次生成器对象的重新执行,这时候如果patch这个值变了在这里插入图片描述
感觉好像这个生成器对象固定下来了(是不是把参数也固定下来了),
self。patch,修改成5,又问它要了一把数据,是可以拿到5个的
在这里插入图片描述
生成器出现了yield,每执行到yield,是会停留下来,下一次执行的时候,变量是可以进行变化的
修改下面的试试
每一次执行的时候count都在变化,每一次执行的时候都要看到count是几
在这里插入图片描述
跟self.patch是一样的
在这里插入图片描述
所以其实只是固定了生成器对象,生成器对象调用哪个函数,计算的时候变量是几就是几

但是最终从里面返回用户想要的数据还是生成器,看具体情况
简单数据生成过程,分成几种方法,演化完成
在这里插入图片描述在这里插入图片描述在这里插入图片描述
愿意用哪种都可以
还可以做其他事情,现在得到随机数这个类

在这里插入图片描述
用上一题随机生成数字的类,来随机生成20个数字,需要一个坐标系的坐标,20个来凑坐标系,就是10个坐标
在这里插入图片描述
随机数的产生类已经实现了,还需要不需要其他类,还需要一个坐标类,把方法定义到类里面,22配对,放到坐标中,
x ,y self.x=x ,self.y=y
distance 距离,这里传的是,一个点到另一个点,还是point

在这里插入图片描述
一次拿20个,拿到一个列表,用zip试试,拉链在一起,两两配对典型的zip,
rg.generate立即返回一个列表,两个列表,10个,10个,zip按照惰性求值

在这里插入图片描述
拿出来的数据需要想办法给point,用for x ,y 凑点,然后调用pont(x,y)放到列表中,凑出10个点对象
封装在容器这样写就可以了
遍历解构到xy上
在这里插入图片描述
坐标系的定义,x轴y轴即可,用面向对象的方式,尽量找到参与方,封装成类,用类的方式对数据进行操作,point的坐标对象
在这里插入图片描述
在这里插入图片描述
用zip最简单,组织起来,想办法把这一堆东西装起来,如果返回一个生成器建议都起名字叫iter什么的东西,这样就别人看得懂在这里插入图片描述在这里插入图片描述
用getinstance就距离两点之间的距离,有公式
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
两个类,一个汽车类,一个增加信息类
可以把__dic__里面的遍历出,把保护遍历,私密成员,_,__单下划线的双下划线的排除掉

!在这里插入图片描述
还有写一个汽车信息类,
get_all_car_info(获取信息可以按照时间,名字,范围来限定,不可能全部给出信息,要知道上下限
self里没有cars,就append进去(用属性访问就有一个搜索过程,首先在自己的实例字典中去搜,如果没有,就到类的字典里去看,类的字典没有就会继续往后去搜索)

在这里插入图片描述
还可以用类属性,类属性还真合适,carinfo是集中管理数据的,需要建立多个容器来管理,如果要用实例属性,carinfo就需要多造几个实例属性出来,就没有这个必要
在这里插入图片描述
可以让carinfo不实例化,直接使用类方法,
用的时候,这么使用carinfo.add_car(car())

在这里插入图片描述
所以没必要 把carinfo实例化,我们有一个集中管理数据就够了

下面就是做成实例的样子,首先在使用的时候就必须要实例化
在这里插入图片描述
类属性只有一份,这种就属于容器有多个,(等于车辆管理有三个,个是个的管理车辆,但是在这注册数据只有一份,这么造就不合适,虽然有三个地方,实例三个,不能在A注册了后,B看不到把
这个就是每个实例有一个容器,不共用
在这里插入图片描述
这样就是每个实例都共用一个容器,这个容器在类的上面定义即可在这里插入图片描述
这样就可以用这种方式加进去了在这里插入图片描述
现在要得到所有车辆属性,如果数据规模大就需要考虑用生成器方式指定范围返回在这里插入图片描述
执行以下,一个列表有一个car对象,这是一种字符串的表达,自定义的类,字符串的表达就这样,默认打印格式,告诉你是谁,对象在哪里
在这里插入图片描述
如果非要看,就这么写
先写到car上

在这里插入图片描述
一个有作用一个没作用
在这里插入图片描述
这种也是字符串的表达形式
在这里插入图片描述在这里插入图片描述
print想要好看就用repr
在这里插入图片描述
再次执行,第一个类名,品牌,颜色,速度,价格
在这里插入图片描述
repr这个意思就是表达的意思,给人看的
在这里插入图片描述
其实也算是一种字符串的表达形式,看你这个匹配对象是不是name,把对象print出来,有人匹配很长,就可以做一下切片,把匹配出来的内容可以切片掉,:20是可以超界的
match对象,写日志的时候,要看start,end

在这里插入图片描述
再加一辆车试试,同一个型号加两次,这样就方便观察数据是否正确在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值