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 = ...
随机推荐
- 聊聊、Nginx 初始化错误信息
这篇文章我们继续学习 main 方法,我们先来看看 ngx_debug_init() 这个方法. 从方法名我们也知道,debug初始化.我们先看看方法位置在哪.我们来断点在这个方法上面. Functi ...
- Python开启进程的2中方式
知识点一:进程的理论 进程:正在进行的一个程序或者说一个任务,而负责执行任务的则是CPU 进程运行的的三种状态: 1.运行:(由CPU来执行,越多越好,可提高效率) 2.阻塞:(遇到了IQ,3个里面可 ...
- API生命周期第三阶段:API实施模式,以及结合swagger和项目现状的最佳模式
这篇博客,主要是宏观介绍一下开发模式,尤其是针对于目前公司前后分离的项目! 一.API实施模式概述 API实施模式,主要是三个,其中API-First又是作为一种指导思想的一种,所以,简单来说事实实施 ...
- Hadoop HDFS 中的一些常用命令
转载自:hadoop HDFS常用文件操作命令 命令基本格式: hadoop fs -cmd < args > 1.ls hadoop fs -ls / 列出hdfs文件系统根目录下的目录 ...
- window maven安装(六)
Maven 实战系列之在Windows上安装Maven Maven是一个优秀的构建工具(类似于 Ant, 但比 Ant 更加方便使用),能帮助我们自动化构建过程,从清理.编译.测试到生成报告,再到打包 ...
- 我要好offer之 系统基础大总结
1. APUE Unix环境高级编程 (1) Unix基础知识: 内核->系统调用->shell和库函数->应用软件 (2) 文件I/O:read函数返回值.进程的文件描述符表.文件 ...
- Codevs 1148 == 洛谷 P1057 传球游戏
1148 传球游戏 2008年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 上体育课的时候,小蛮的老师 ...
- Codeforces878E. Numbers on the blackboard
$n \leq 100000$的数列,数字范围$-1e9,1e9$,现$q \leq 1e5$个每次问在一个区间玩游戏,能得到的最大的数.“游戏”:选相邻两个数$a_x,a_y$,然后把他们删掉,变成 ...
- php validator classes
<?php /** * 验证类 */ class Validator { /* 函数名称:isNumber 简要描述:检查输入的是否为数字 输入:string 输出:boolean */ pub ...
- Linux 之 FTP服务器搭建
FTP服务器搭建 参考教程:[千峰教育] 1.关闭防火墙: service iptables stop 2.关闭Selinux setenforce 0 3.安装所需要依赖及编译工具 yum inst ...