当前位置: 首页 > news >正文

Python学习之Day05学习(定制数据对象,面向对象)

一、前情回顾

根据数据清洗确定排序列表不重复性元素,采用了如下案例

# coding=utf-8###  有关清理数据的函数(数据清洗)
def santize(time_string):if '-' in time_string:spliter='-'elif ':' in time_string:spliter=':'else:return time_stringminutes,seconds=time_string.split(spliter)return(minutes+'.'+seconds)def get_coach_data(filename):try:with open(filename) as f:data = f.readline()return data.strip().split(',')except IOError as error:print('File error:'+str(error))return (None)sarch=get_coach_data('sarah.txt')
sarch_name,sarch_dob=sarch.pop(0),sarch.pop(0)
print(sarch_name+"'s fasterst times are"+str(sorted(set([santize(t) for t in sarch]))[0:3]))

二、数据类型之字典表示

使用字典时,键对于字典来说无非就是唯一的

>>    num={}>>    num=dict()>>    num
{}>>    type(num)
<class 'dict'>>>    num['one']=1>>    num['two']=2>>    num
{'one': 1, 'two': 2}>>    num['one']
1>>    num['two']
2>>    num['nums']=[1,2,3,4,5,6]>>    num
{'one': 1, 'two': 2, 'nums': [1, 2, 3, 4, 5, 6]}>>    num['nums'][0]
1>>    num['nums'][-1]
6

优前情回顾内容:

def get_coach_data(filename):try:with open(filename) as f:data = f.readline()return data.strip().split(',')except IOError as error:print('File error:'+str(error))return (None)sarch=get_coach_data('sarah.txt')
sarch_data={}
sarch_data['name']=sarch.pop(0)
sarch_data['dob']=sarch.pop(0)
sarch_data['times']=sarch
print(sarch_data['name']+"'s fastest time are:'"+str(sorted(set(santize(t) for t in sarch_data['times']))[0:3]))

优化字典作为返回值,重写代码:

def santize(time_string):if '-' in time_string:spliter='-'elif ':' in time_string:spliter=':'else:return time_stringminutes,seconds=time_string.split(spliter)return(minutes+'.'+seconds)def get_coach_data(filename):try:with open(filename) as fdata = f.readline()templ=data.strip().split(',')
#####修改部分代码#####return({'name':templ.pop(0),'dob':templ.pop(0),'times':str(sorted(set(santize(t) for t in templ))[0:3])})except IOError as error:print('File error:'+str(error))return (None)james=get_coach_data('james.txt')
sarch=get_coach_data('sarah.txt')
print(james['name']+"'s fastest time are:'"+james['times'])
print(sarch['name']+"'s fastest time are:'"+sarch['times'])

三、将对象打包到类中

  • 定义一个类

  • 类的定义图解

  • 类的对象实例

  • 针对self如何使用

class Athelete:def __init__(self,value=0):self.thing=valuedef how_big(self):return len(self.thing)
d=Athelete("halo go!!!")
print(d.how_big())
print(d.thing)

字典和列表类型的转换

a={}
lol=[['a','b'],['c','d'],['e','f']]
l=dict(lol)
print(l)        ##{'a': 'b', 'c': 'd', 'e': 'f'}

字典和元组的转换

lot=[('a','b'),('c','d'),('e','f')]
dict(lot)       ##{'a': 'b', 'c': 'd', 'e': 'f'}

字典和字符串(要求双字符)转换

los=['ab','bc','cd','de']
l=dict(los)
print(l)        ## {'a': 'b', 'b': 'c', 'c': 'd', 'd': 'e'}

字典中元素使用

## 往字典中添加元素
d={}
d['l1']=1
print(d)    ### {'l1': 1}
d['l2']=2
print(d)    ### {'l1': 1, 'l2': 2}## 修改元素的值
d={}
d={"l1":1,"l2":2}
d.update({"l3":3,"l4":4})
print(d)    ##{'l1': 1, 'l2': 2, 'l3': 3, 'l4': 4}##  删除元素中的值
del d['l4']
print(d)    ## {'l1': 1, 'l2': 2, 'l3': 3}## 判断是否在键值对存在相应的键
print("l1" in d)    ## True## 清空所有元素
d.clear()    ## {}## 获取字典中key和value的情况
print(d.keys()) ## dict_keys(['l1', 'l2', 'l3'])
print(d.values())   ## dict_values([1, 2, 3])
print(list(d.values())) ## [1, 2, 3]
print(d.items())    ## dict_items([('l1', 1), ('l2', 2), ('l3', 3)])
print(list(d.items()))  ## [('l1', 1), ('l2', 2), ('l3', 3)]## 将压缩的列表组合成一个字典
l1=[1,2,3]
l2=['one','two','three']
zipped=zip(l1,l2)
print(dict(zipped))     ## {1: 'one', 2: 'two', 3: 'three'}## 字典拷贝
d={'l1':1,'l2':2,'l3':3}
d2=d
d.update({'l4':4})
print(d2)    ## {'l1': 1, 'l2': 2, 'l3': 3, 'l4': 4}d={'l1':1,'l2':2,'l3':3}
d2=d.copy()
d.update({'l4':4})
print(d2)    ## {'l1': 1, 'l2': 2, 'l3': 3}

数据类型之集合

set集合的使用(去重)       

有关字典和列表的扩充

### 推倒单词的个数
word='letters'
letters_counts={letter:word.count(letter) for letter in set(word)}
print(letters_counts)
'''
{'e': 2, 's': 1, 'l': 1, 'r': 1, 't': 2}
'''## 推倒并判断集合
a_set={1,2,3,4,5,6}
a_set={number for number in range(1,6) if number%2==1}
print(a_set)    '''  {1, 3, 5} '''a_set={1,2,3,4,5,6}
a_set={number for number in range(1,6) if number%3==1}
print(a_set)    '''{1, 4}'''

数据类型的总结

## 将列表组合成元组
num=[1,2,3]
name=["l1","l2","l3","l4"]
english=["one","two","three","four","five"]
tol=num,name,english
print(tol)      ## ([1, 2, 3], ['l1', 'l2', 'l3', 'l4'], ['one', 'two', 'three', 'four', 'five'])## 组合成一个统一的列表
tol=[num,name,english]
print(tol)  ## [[1, 2, 3], ['l1', 'l2', 'l3', 'l4'], ['one', 'two', 'three', 'four', 'five']]## 字典的组合
dol={"num":num,"name":name,"english":english}
print(dol)      ## {'num': [1, 2, 3], 'name': ['l1', 'l2', 'l3', 'l4'], 'english': ['one', 'two', 'three', 'four', 'five']}## 复杂数据的获取
house={(44.79,-93.14,285):'my_house',(38.97,-77.04,13):'The white house'}
print(house[44.79,-93.14,285])  ## my_house##  关于==和is的区别
== 比较值是否相等(比较内存地址),而is则用于比较数据类型
a=1
b=1.0
print(a==b) ## True
print(a is b)   ## Falsec=1
print(a==c)     #True
print(a is c)   #True## 组合打印列表--->元组
cells=[(rows,cols) for rows in row if rows%2==1 for cols in col if cols%2==1]
for cell in cells:print(cell)for row,cols in cells:print(row,cols)

面相对象概念及使用

使用对象优化demo,将字典数据转换成对象的形式进行存储

class Athelete:def __init__(self,a_name,a_job=None,a_time=[]):self.name=a_nameself.job=a_jobself.time=a_timedef top3(self):return sorted(set([santize(t) for t in self.time]))[0:3]def santize(time_string):if '-' in time_string:spliter='-'elif ':' in time_string:spliter=':'else:return time_stringminutes,seconds=time_string.split(spliter)return(minutes+'.'+seconds)def get_coach_data(filename):try:with open(filename) as f:data = f.readline()templ=data.strip().split(',')# return({#     'name':templ.pop(0),#     'dob':templ.pop(0),#     'times':str(sorted(set(santize(t) for t in templ))[0:3])# })return (Athelete(templ.pop(0),templ.pop(0),templ))except IOError as error:print('File error:'+str(error))return (None)james=get_coach_data("james.txt")
print(james.name+"'s faster are:"+str(james.top3()))

扩展一个增加时间的版本函数

class Athelete:def __init__(self,a_name,a_job=None,a_time=[]):self.name=a_nameself.job=a_jobself.time=a_timedef top3(self):return sorted(set([santize(t) for t in self.time]))[0:3]### 扩展增加时间APIdef add_time(self,time_value):self.time.append(time_value)def add_times(self,list_of_times):self.time.extend(list_of_times)
def santize(time_string):if '-' in time_string:spliter='-'elif ':' in time_string:spliter=':'else:return time_stringminutes,seconds=time_string.split(spliter)return(minutes+'.'+seconds)def get_coach_data(filename):try:with open(filename) as f:data = f.readline()templ=data.strip().split(',')# return({#     'name':templ.pop(0),#     'dob':templ.pop(0),#     'times':str(sorted(set(santize(t) for t in templ))[0:3])# })return (Athelete(templ.pop(0),templ.pop(0),templ))except IOError as error:print('File error:'+str(error))return (None)# james=get_coach_data("james.txt")
# print(james.name+"'s faster are:"+str(james.top3()))
# james.add_times(['2.22','1-11','3:66'])
# print(james.top3())varos=Athelete('Vara vi')
varos.add_times(['3.88','1-11','6:88'])
print(varos.top3())     ## ['1.11', '3.88', '6.88']

面向对象之继承类

class AthleteList(list):## 属性def __init__(self,a_dob=None,a_times=[]):## 初始化父类信息list.__init__([])self.name=a_dobself.times=a_timesself.extend(a_times)## 方法def top3(self):return sorted(set([santize(t) for t in self]))[0:3]def santize(time_string):if '-' in time_string:spliter='-'elif ':' in time_string:spliter=':'else:return time_stringminutes,seconds=time_string.split(spliter)return(minutes+'.'+seconds)def get_coach_data(filename):try:with open(filename) as f:data = f.readline()templ=data.strip().split(',')# return({#     'name':templ.pop(0),#     'dob':templ.pop(0),#     'times':str(sorted(set(santize(t) for t in templ))[0:3])# })return (AthleteList(templ.pop(0),templ.pop(0),templ))except IOError as error:print('File error:'+str(error))return (None)# james=get_coach_data("james.txt")
# print(james.name+"'s faster are:"+str(james.top3()))
# james.add_times(['2.22','1-11','3:66'])
# print(james.top3())## 通过自定义对象提供了对象的可扩展性varos=AthleteList('Vara vi')
print(varos)
varos.append('1.31')
print(varos.top3())varos.extend(['2.22','1-21','2:66'])
print(varos)                    ## ['1.31', '2.22', '1-21', '2:66']
print(varos.top3())             ## ['1.21', '1.31', '2.22']

四、面向对象

propetry和attribute方法


### 案例实现
### demo1 实现对象的定义和赋值
class Person():def __init__(self,name):self.name=name
xm=Person("xiaoming")       ## 实例化--->对象
Person.__init__(xm,'xiao ming')print(type(xm))         ## <class '__main__.Person'>
print(xm.name)          ## xiaomingprint(id(xm))             ## 2380080119568
print(hex(id(xm)))       ## <class '__main__.Person'>### demo2 重写一个子类实现父类的方法
class Person():def __init__(self,name):self.name=namedef get_name(self):return self.name
##  这里将父类所继承的方法进行重写
class Man(Person):def get_name(self):return "Man"xm=Person("xiao ming")
print(xm.get_name())            ## xiao mingxm=Man("xiao ming")
print(xm.get_name())            ## Man## demo3 针对父类属性进行初始化
class Person():def __init__(self,name):self.name=namedef get_name(self):return self.name
class Man(Person):## 针对父类属性进行初始化def __init__(self,name,sex):Person.__init__(self,name)self.sex=sexdef get_name(self):return "Man"xm=Person("xiao ming")
print(xm.get_name())            ## xiao mingxm=Man("xiao ming",'boy')
print(xm.name+xm.sex)            ## Man## demo4   子类继承了父类同样拥有父类所包含的方法
class Car():def exclaim(self):print("I'm am car!!!!")
class Tesla(Car):pass
give_me_a_car=Car()
give_me_a_car.exclaim()
give_me_a_Tesla=Tesla()      
give_me_a_Tesla.exclaim()       ## 子类继承了父类同样拥有父类所包含的方法##demo5    父类覆盖了父类原有的方法
class Car():def exclaim(self):print("I'm am car!!!!")
class Tesla(Car):        ## 父类完成了子类的初始化def exclaim(self):print("I'm tesla!!")
give_me_a_car=Car()
give_me_a_car.exclaim()
give_me_a_Tesla=Tesla()
give_me_a_Tesla.exclaim()## 基于父类多种子类方法
class Person():def __init__(self,name):self.name=nameclass MDPerson(Person):def __init__(self,name):self.name="Docker"+nameclass JDPerson(Person):def __init__(self,name):self.name =name+",Esquire"person=Person('fudd')
doctor=MDPerson('fudd')
lawyer=JDPerson('fudd')
print(person.name)
print(doctor.name)
print(lawyer.name)##demo6    实现构造方法的多构建
class car():def exlaim(self):print("I'm a car!!!!")
class Tesla():def exlaim(self):print('I am a tesla')def need_a_push(self):print('A little help here?')give_me_a_car=car()
give_me_a_car.exlaim()
give_me_a_tesala=Tesla()
give_me_a_tesala.need_a_push()

super调用

使用super方法可以让子类调用父类的方法

class Person:def __init__(self,name):self.name=nameclass EmailPetrson(Person):def __init__(self,name,email):super().__init__(name)      ## 子类调用父类方法,父类的方法已经被子类所引用self.email=emailbob=EmailPetrson('bob','bob@163.com')
print(bob.name,bob.email)

对getter和setter属性进行隐藏(封装)

class Duck():def __init__(self,input_name):self.hide_name=input_namedef get_name(self):print('inside getter')return self.hide_namedef set_name(self,input_name):print('insider setter')self.hide_name=input_namename=property(get_name,set_name)        ## 通过字段将getter和setter内容进行隐藏
fowl=Duck('hallo')## 同过此特性隐藏了对象中的内容(装饰器)
print(fowl.name)
fowl.name=('hllll')fowl.set_name('6666')
print(fowl.name)# ## 通过getter也可调用内部方法
# print(fowl.get_name())
#
# fowl.hide_name='ooookkkkk'
# print(fowl.hide_name)

装饰器的使用

  •  @classmethod和@property使用

## property装饰器的用法## demo1
class Duck():def __init__(self,input_name):self.hide_name=input_name@propertydef name(self):                 ## 函数名发生修改print('inside getter')return self.hide_name@name.setterdef name(self,input_name):      ## 函数名发生修改print('insider setter')self.hide_name=input_name# name=property(get_name,set_name)        ## 通过字段将getter和setter内容进行隐藏
fowl=Duck('hallo')## 同过此特性隐藏了对象中的内容
print(fowl.name)
fowl.name=('hllll')
print(fowl.name)## demo2
class Circle():def __init__(self,radius):self.radius = radius@propertydef diameter(self):return 2*self.radiusc=Circle(5)
print(c.diameter)   ## 10
c.radius=7
print(c.diameter)   ## 14## demo3
class Duck():def __init__(self, input_name):self.__name = input_name@propertydef name(self):print('inside the getter')return self.__name@name.setterdef name(self,input_name):print('inside the setter')self.__name = input_namefowl=Duck('hallo')
print(fowl.name)
fowl.name='Hooc'
print(fowl.name)## demo4    @classmethodclass A():## 这里的count是类全局的变量count=0def __init__(self):A.count+=1def exclaim(self):print('I am an A!!!')@classmethoddef kids(cls):print('A has',cls.count)
num_A=A()
buzzsy_A=A()
whezzy_a=A()
A.kids()

@staticmethod使用

定义之后的方法不需要传递参数(self,cls)

### staticmethod
class A:@staticmethoddef a():print('I AM GOOD')
A=A.a()## instance method,class method,static methodclass A:count=0def __init__(self):A. count+=1def exclaim(self):print('I AM an A')@classmethoddef kids(cls):print('A has',cls.count)@staticmethoddef a():print('我是A')a=A()## 类方法
A.kids()
A.exclaim()## 实例化方法
a.kids()
a.exclaim()

多态练习使用

## 鸭子类型class Quote():def __init__(self,person,words):self.person = personself.words = wordsdef who(self):return self.persondef says(self):return self.words+'.'class QuestionQuote(Quote):def says(self):return self.words+'?'class ExclamationQuote(Quote):def says(self):return self.words+'!'class BabblingBrook():def who(self):return 'Brook'def says(self):return 'Babble'
brook=BabblingBrook()
def who_says(obj):print(obj.who(),'says',obj.says())who_says(brook)hunter=Quote('Elmer Fudd',"I'm a good day")
# print(hunter.who(),'says:',hunter.says())
#
hunter1=QuestionQuote('Bus Bunny',"what's up,doc")who_says(hunter1)
# print(hunter1.who(),'says:',hunter1.says())
hunter2=ExclamationQuote('Daffy Ducks',"it's rabbit season")who_says(hunter2)
# print(hunter2.who(),'says:',hunter2.says())

常见的魔术方法使用

class world:def __init__(self,text):self.text=textdef equals(self,word2):return self.text.lower()==word2.text.lower()first=world('hai')
second=world('HAI')
third=world('llo')
print(first.equals(second))     ## True
print(second.equals(third))     ## Falseclass word():def __init__(self,text):self.text=textdef __eq__(self, word2):return self.text.lower()==word2.text.lower()first=word('ha')        ##  True
second=word('HA')       ##  False
third=word('LO')

常见的魔术方法(见如下魔术方法)

 

class word():def __init__(self,text):self.text=textdef __eq__(self, word2):return self.text.lower()==word2.text.lower()def __str__(self):return self.textdef __repr__(self):return 'Word('+self.text+')'first=word('ha')     ### first结果是word(ha)
print(first)         ###  ha 

对象的组合使用

### 类与类之间不存在继承关系,而是彼此互相组合在一起
class Tail():def __init__(self,length):self.length = lengthclass Bill():def __init__(self,description):self.description =descriptionclass Duck():def __init__(self,bill,tail):self.bill = billself.tail = taildef about(self):print('The duck has a',self.bill.description,'bill and a',self.tail.length,'tail')tail=Tail('long')
bill=Bill('orange')
duck=Duck(bill,tail)
duck.about()            ##  The duck has a orange bill and a long tail

五、综合练习

验证一个文本里面的密码,如果正确返回,不正确重试3次,添加注册(用户名和密码)登录流程
密码文件使用pickle标准库保存
import pickle
import getpass
## 读取文件内容
def open_database():try:with open('passwd.pkl', 'rb') as f:return pickle.load(f)except IOError as error:return Falseexcept Exception as e:raise  False## 更新文本内容
def update_database(user_data):try:with open('passwd.pkl','wb') as f:pickle.dump(user_data,f)return Trueexcept IOError as error:return Falseexcept Exception as e:raise  False## 注册
def register():## 输入用户名和密码username=input('请输入用户名:')## {"username":"passwd"}user_data=open_database() if open_database() else {}if username in user_data.keys():print('用户已经存在')return Falseuserpasswd=input("请输入密码:")user_data[username]=userpasswddb_status=update_database(user_data)if not db_status:print('注册失败!')print('注册成功')## 登录
def login():count=0username = input('请输入用户名:')while count<3:userpasswd=input("请输入密码:")# userpasswd = getpass.getpass("请输入密码:")    ## 隐藏密码user_data=open_database()passwd=user_data.get(username)if passwd is None:print('用户不存在!')breakif userpasswd!=passwd:count+=1print('密码错误!,请重试,最多3次')continueprint('密码正确!')breakelse:print('已经重试了3次,退出!')## 入口
def main():while True:user_choice=input("1.注册  2.登录   0.退出")if user_choice=="1":register()elif user_choice=="2":login()else:breakif __name__ == '__main__':main()

http://www.dtcms.com/a/443486.html

相关文章:

  • 公司网站 备案济南网站营销
  • 算法 | Recursion vs Iteration
  • 征求网站建设WordPress禁用评论回收站
  • SDKMAN管理 Java 多版本
  • 找在家做的兼职上什么网站好wordpress插件重写
  • 织梦网站新闻列表调用挣钱最快的小游戏
  • 创造力网站设计seo关键词搜索和优化
  • 数据传输对象(DTO)中什么时候用int,什么时候用Integer
  • 广州注册公司核名在哪个网站网站建费用
  • 可以上传自己做的视频的网站网站维护的注意事项
  • 做暧嗳xo小视频网站深度开发
  • 电商类网站开发网上搞钱的野路子
  • 网站打不开服务器错误建设银行官网登录入口
  • HandlerThread源码阅读
  • 口碑好的番禺网站建设腾讯云自助建站
  • 54所面经准备
  • 宣讲家网站美丽乡村建设怎么创网站赚钱吗
  • 如何建立小程序网站网站开发技术项目代码搜索
  • C语言编译执行过程
  • 网站长尾词排名做不上去响应式布局代码怎么写
  • 【Linux】进程信号(1)
  • 男女做那个的的视频网站常见的网页设计工具
  • 做网站时管理员权限的页面wordpress标签前缀
  • 建网站找哪个平台好呢专业简历制作网站有哪些
  • 3.2.2 LangChain.js + LangGraph.js 实战
  • ARL资产侦察灯塔系统一键部署教程(2025最新)
  • 山东省环保厅官方网站建设项目网站建设好找工作吗
  • ui界面设计说明范文网站排名优化价格
  • SSM大学请假管理系统e9kl1(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • java基础-11 : 数据结构与算法