题目一:总结

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)- 面向对象练习Ⅱ的更多相关文章

  1. Python OOP面向对象

    一.什么是面向对象的程序设计 1.面向过程 程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式. 优点是 ...

  2. Python 3 面向对象 一

    Python 3 面向对象 一.面向过程-->面向对象 面向过程:根据业务逻辑从上到下堆叠代码,即先干什么再干什么,基于面向过程去设计程序就好比在设计一条流水线,是一种机械式的思维方式 函数式: ...

  3. Python 【面向对象】

    前言 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过面向对象的编程语言 ...

  4. python基础——面向对象编程

    python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  5. Python的面向对象3

    接下来,我们接着讲Python的面向对象,在上一次的博客中,我们详细介绍了类与对象的属性,今天,我们来详细介绍一下面向对象中的方法! 1.定义实例方法 一个实例的私有属性就是以__开头的属性,无法被外 ...

  6. Python的面向对象2

    我们接着讲解Python的面向对象 1.初始化实例属性 在现实生活中,一种类型的实例会具有相同的某些属性,把这些实例划分为一个类型,则这些实例必然有相似的部分.但是,在创建实例之后,我们一个一个的为实 ...

  7. Python的面向对象1

    今天,我们来介绍Python的面向对象编程,其实面向对象并不陌生,在C++  ,Java  ,PHP中也有大量使用! 好了,我们来步入正题! 那什么是面向对象编程呢? 1. 面向对象编程是一种程序设计 ...

  8. My way to Python - Day05 - 面向对象-思维导图

    My way to Python - Day05 - 面向对象   思维导图

  9. Python进阶---面向对象的程序设计思想

    Python的面向对象 一.面向过程与面向对象的对比 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...

  10. Python之面向对象一

    引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blood,aggr,kind): dog = ...

随机推荐

  1. TensorFlow笔记——

    主要依赖包 protocal buffer 处理结构化数据的工具:序列化(结构化数据->数据流) + 还原(数据流->结构化数据) protocol buffer与XML和JSON的区别: ...

  2. ansible /usr/bin/python: not found

    使用ansible命令的时候出错 ansible all -m ping 出现报错 192.168.199.154 | FAILED! => { "changed": fal ...

  3. Use of @OneToMany or @ManyToMany targeting an unmapped class:hibernate映射错误

    hibernate映射异常:Use of @OneToMany or @ManyToMany targeting an unmapped class 新建了PO以后,要把PO所在的目录加入到Hiber ...

  4. Kafka单机配置部署

    摘要:上节 学习了Kafka的理论知识,这里安装单机版以便后续的测试. 首先安装jdk 一.单机部署zk 1.1安装: tar -zxf zookeeper-3.4.10.tar.gz -C /opt ...

  5. 【Luogu】P3521ROT-Tree Rotations(线段树合并)

    题目链接 神奇的线段树合并qwq   不过就思路而言很好想…… 观察到一棵树无论怎么交换两棵左右子树,子树内部的最优逆序对并没影响……决策只影响左右子树之间的逆序对…… 于是线段树合并直接乱搞就好啦 ...

  6. 解决使用webbrowser请求url时数据传递丢失问题

    问题: 使用“ this.webBrowser.Url = new Uri(webBrowserUrl);”方式请求Action(Java Web)并传递数据,在webBrowserUrl中携带的参数 ...

  7. UML学习倒腾记

    先看到http://www.jianshu.com/p/1256e2643923这篇博客,号称21分钟入门uml,也许是我太笨了吧,一下午也没有完全搞定: 使用过atom编辑器,没有完全运行出来结果. ...

  8. 算法 & 数据结构——任意多边形填充

    需求 . 在计算机中,选区是一个很常见的功能,例如windows按住鼠标左键拖动划出矩形选区,Photshop通过钢笔工具任意形状选区.选区本身不过是通过线段闭合的一个几何形状,但是如何填充这个选区, ...

  9. py2exe使用方法 (含一些调试技巧,如压缩email 类)

    http://justcoding.iteye.com/blog/900993 一.简介 py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样, ...

  10. jQuery设置 select、radio、checkbox 默认选中的值

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...