python(28)- 面向对象练习Ⅱ
题目一:总结
1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性?
类内定义的函数,不经装饰器装饰,被实例化对象调用,会默认传入一个self参数,对象将会传递给self;
定义方式比较普通‘def 函数名(self):’;
调用方式‘对象.函数名()’;
类和对象都可以调用,被对象调用称为绑定方法。
2.什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性?
类内部定义的函数,经过@classmethod装饰器装饰,会默认传入一个cls参数,调用该方法的类将传递给cls;
定义方式‘def 函数名(cls):’;
调用方式‘类名.函数名()’;
主要是给类调用,对象也可以强行调用,但是还算是对象所属类的调用,所以一般不推荐。
3.什么是解除绑定的函数,如何定义,如何调用,给谁用?有什么特性?
同样是类内部定义的函数,经过@staticmethod装饰器装饰,没有默认传入的参数;
定义方式‘def 函数名()’;
调用方式‘类名.函数名()’;
仅提供给类调用,不考虑给对象使用,可以比作类的另外一种实例化方式。
4.什么是property,如何定义,如何使用,给谁用,什么情况下应该将一个属性定义成property,有什么好处?
property译为特征,将有变量特征的函数进行@property装饰,直接可以通过函数名调用;
可以将隐藏属性定义函数形成借口,便于调用;
调用方便,直接通过‘对象.函数名’调用。
以上题目详细参考http://www.cnblogs.com/xuyaping/p/6723862.html中静态方法和类方法的总结
题目二:
一:自定义用户信息数据结构,写入文件,然后读出内容,利用eval重新获取数据结构
- with open('user.db','w') as write_file: #创建并以写入的方式打开一个文件user.db
- write_file.write(str({ #在user.db中加入两个用户信息以字典的方式储存
- "egon":{"password":"123",'status':False,'timeout':0},
- "alex":{"password":"456",'status':False,'timeout':0},
- }))
- with open('user.db','r') as read_file: #以只读的方式打开一个文件user.db
- data=read_file.read() #读取user.db中的数据
- d=eval(data) #将user.db中的数据转为字典
- print(d['egon']['password']) #打印字典中egon的password 对应value
- print(d['egon']['status'])
- print(d['egon']['timeout'])
二:定义用户类,定义属性db,执行obj.db可以拿到用户数据结构
- class User: #定义User类
- db_path='user.db'
- def __init__(self,username): #在实例化User类时,传入Username参数的值
- self.username=username
- @property #将db()方法作为属性,让用户调用
- def db(self):
- data=open(self.db_path,'r').read() #以只读的方式打开文件user.db
- return eval(data) #以字典的方式返回user.db中的内容
- u=User('egon') #实例化对象u,传入egon
- print(u.db['egon']) #打印又u.db()返回的字典中,对应egon的value
- print(u.db['egon']['password']) #打印又u.db()返回的字典中,对应egon的password,value
三:分析下述代码的执行流程
- import time
- class User:
- db_path = 'user.db'
- def __init__(self, name):
- self.name = name
- @property
- def db(self):
- with open(self.db_path, 'r') as read_file:
- info = read_file.read()
- return eval(info)
- @db.setter
- def db(self, value):
- with open(self.db_path, 'w') as write_file:
- write_file.write(str(value))
- write_file.flush()
- def login(self): # 3、self接收对象u1
- data = self.db # 4、u1调用db属性,寻找实例化中的db属性,返回值为‘user.db’文件中的数据结构,并赋值给date
- if data[self.name]['status']: # 5、判断对象u1的status字段bool值(等于date['egon']['status]),为Ture执行下面代码-->#6,否则跳过-->#8
- print('已经登录') # 6、为真打印
- return True # 7、返回Ture,结束函数-->#end
- if data[self.name]['timeout'] < time.time(): # 8、判断对象u1的timeout字段(等于date['egon]['timeout'])是否小于当前时间,小于执行一下代码-->#9,否则执行else-->#22
- count = 0 # 9、设置计数器count
- while count < 3: # 10、当计数器<3时执行循环
- passwd = input('password>>: ') # 11、请用户输入密码,赋值给passwd
- if not passwd: continue # 12、如果passwd为空,跳出执行下一次循环-->10,否则继续-->#13
- if passwd == data[self.name][
- 'password']: # 13、判断passwd是否等于date['egon']['password'],为Ture执行以下代码-->#14,否则-->#18
- data[self.name]['status'] = True # 14、将date中u1['egon']['status']改为Ture
- data[self.name]['timeout'] = 0 # 15、将date中u1['egon']['timeout']改为0
- self.db = data # 16、赋值语句就调用u1的db属性经@db.setter装饰的方法,将修改写入文件中
- break # 17、跳出循环-->#end
- count += 1 # 18、密码不对,计数器+1,继续循环-->#10
- else: # 19、用户输入密码一直错误,计数器超过循环要求,循环正常结束,执行以下代码-->#20
- data[self.name]['timeout'] = time.time() + 10 # 20、将date中u1['egon']['timeout']改为当前时间+十秒
- self.db = data # 21、将修改结果,写入文件中-->#end
- else: # 22、对象u1的timeout字段大于当前时间
- print('账号已经锁定10秒') # 22、打印提示--#end
- u1 = User('egon') # 1、实例化对象u1,name=‘egon
- u1.login() # 2、u1调用login方法-->3
- u2 = User('alex')
- u2.login()
要求四:根据上述原理,编写退出登录方法(退出前要判断是否是登录状态),自定义property,供用户查看自己账号的锁定时间
- import time
- class User:
- db_path = 'user.db'
- def __init__(self, name):
- self.name = name
- @property
- def db(self):
- with open(self.db_path, 'r') as read_file:
- info = read_file.read()
- return eval(info)
- @db.setter
- def db(self, value):
- with open(self.db_path, 'w') as write_file:
- write_file.write(str(value))
- write_file.flush()
- @property
- def check_lock_time(self):
- with open(self.db_path, 'r') as read_file:
- info = read_file.read()
- info = eval(info)
- if info[self.name]['timeout'] > time.time():
- time_diff = info[self.name]['timeout'] - time.time()
- print('您的账号剩余锁定时间%s秒' % int(time_diff))
- else:
- print('您的账号未被锁定')
- def login(self):
- data = self.db
- if data[self.name]['status']:
- print('已经登录')
- return True
- if data[self.name]['timeout'] < time.time():
- count = 0
- while count < 3:
- passwd = input('password>>: ')
- if not passwd: continue
- if passwd == data[self.name]['password']:
- data[self.name]['status'] = True
- data[self.name]['timeout'] = 0
- self.db = data
- break
- count += 1
- else:
- data[self.name]['timeout'] = time.time() + 10
- self.db = data
- else:
- print('账号已经锁定10秒')
- def logout(self):
- date = self.db
- if date[self.name]['status']:
- date[self.name]['status'] = False
- self.db = date
- print('您已登出')
- return True
- u1 = User('egon')
- u1.login()
- u1.check_lock_time
- u1.logout()
python(28)- 面向对象练习Ⅱ的更多相关文章
- Python OOP面向对象
一.什么是面向对象的程序设计 1.面向过程 程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式. 优点是 ...
- Python 3 面向对象 一
Python 3 面向对象 一.面向过程-->面向对象 面向过程:根据业务逻辑从上到下堆叠代码,即先干什么再干什么,基于面向过程去设计程序就好比在设计一条流水线,是一种机械式的思维方式 函数式: ...
- Python 【面向对象】
前言 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过面向对象的编程语言 ...
- python基础——面向对象编程
python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
- Python的面向对象3
接下来,我们接着讲Python的面向对象,在上一次的博客中,我们详细介绍了类与对象的属性,今天,我们来详细介绍一下面向对象中的方法! 1.定义实例方法 一个实例的私有属性就是以__开头的属性,无法被外 ...
- Python的面向对象2
我们接着讲解Python的面向对象 1.初始化实例属性 在现实生活中,一种类型的实例会具有相同的某些属性,把这些实例划分为一个类型,则这些实例必然有相似的部分.但是,在创建实例之后,我们一个一个的为实 ...
- Python的面向对象1
今天,我们来介绍Python的面向对象编程,其实面向对象并不陌生,在C++ ,Java ,PHP中也有大量使用! 好了,我们来步入正题! 那什么是面向对象编程呢? 1. 面向对象编程是一种程序设计 ...
- My way to Python - Day05 - 面向对象-思维导图
My way to Python - Day05 - 面向对象 思维导图
- Python进阶---面向对象的程序设计思想
Python的面向对象 一.面向过程与面向对象的对比 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...
- Python之面向对象一
引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blood,aggr,kind): dog = ...
随机推荐
- Leetcode 457.环形数组循环
环形数组循环 给定一组含有正整数和负整数的数组.如果某个索引中的 n 是正数的,则向前移动 n 个索引.相反,如果是负数(-n),则向后移动 n 个索引. 假设数组首尾相接.判断数组中是否有环.环中至 ...
- Wannafly模拟赛2
Contest 时间限制:1秒 空间限制:131072K 题目描述 n支队伍一共参加了三场比赛. 一支队伍x认为自己比另一支队伍y强当且仅当x在至少一场比赛中比y的排名高. 求有多少组(x,y),使得 ...
- Conda相关命令的使用
-- Conda basics Conda基础命令 conda info 查看已安装的环境 conda install PACKAGENNAME 安装包 conda update PACKAGENAM ...
- BZOJ 3167 [Heoi2013]Sao ——树形DP
BZOJ4824的强化版. 改变枚举的方案,使用前缀和进行DP优化. 然后复杂度就是$O(n^2)$了. #include <map> #include <cmath> #in ...
- BZOJ1189 [HNOI2007]紧急疏散evacuate 【二分 + 网络流】
题目 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一扇门,人们可以从 ...
- 字符串匹配之Sunday算法
Sunday算法不像KMP算法那么复杂,但是效率又比较高,在KMP之上,下面简单介绍Sunday算法及其实现. Sunday 算法由 Daniel M.Sunday 在 1990 年提出,它的思想跟 ...
- UGUI 点击穿透问题
unity上 用 做游戏欢迎界面上通用的ui,然后导到游戏里面直接用,但发现游戏里面是用ngui的,点击ugui 的ui 会穿透过去 ngui会响应,原本模型的点击处理也会响应 我用的 unity 版 ...
- bzoj 2798 [Poi2012]Bidding 博弈论+dp
题目大意 A和B两个人在玩一个游戏,这个游戏是他们轮流操作一对整数(x,y). 初始时(x,y)=(1,0),可以进行三种操作: 将(x,y)变成(1,x+y). 将(x,y)变成(2x,y). 将( ...
- Android Tools update proxy
Android Tools Android SDK在线更新镜像服务器 中国科学院开源协会镜像站地址: IPV4/IPV6: http://mirrors.opencas.cn 端口:80 IPV4/I ...
- 第一次用写一个3d轮播
2016-07-11gallery 3d html <!doctype html><html lang="en"><head> <met ...