题目一:总结

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. 九度oj 题目1411:转圈

    题目描述: 在一个有向图有n个顶点(编号从1到n),给一个起点s,问从起点出发,至少经过一条边,回到起点的最短距离. 输入: 输入包括多组,每组输入第一行包括三个整数n,m,s(1<=n< ...

  2. php中 ob_start()有什么作用

    <?php ob_start(); //开启缓冲区 echo "这是第一次输出内容!\n"; $ff[1] = ob_get_contents() ; //获取当前缓冲区内容 ...

  3. 2017.8.12 dp课小结

    这节课难度超级大啊,基本上都是省选+NOI的题. 例1: 1801: [Ahoi2009]chess 中国象棋 Time Limit: 10 Sec  Memory Limit: 64 MB Subm ...

  4. P1382 楼房 (扫描线,线段树)

    题目描述 地平线(x轴)上有n个矩(lou)形(fang),用三个整数h[i],l[i],r[i]来表示第i个矩形:矩形左下角为(l[i],0),右上角为(r[i],h[i]).地平线高度为0.在轮廓 ...

  5. centos7配置国内yum源

    文章目录 1.什么是yum仓库? 2.yum仓库配置 2.1.阿里镜像仓库配置 2.1.1.配置步骤 2.1.2.epel源 安装和配置 2.1.3.查看yum源 2.2.配置 清华大学镜像仓库 1. ...

  6. hdu 1558 线段相交+并查集路径压缩

    Segment set Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. hdu 2999 sg函数(简单博弈)

    Stone Game, Why are you always there? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/ ...

  8. La 4670 AC自动机(模版)

    #include<iostream> #include<cstring> #include<queue> #include<cstdio> #inclu ...

  9. poj 3532 Resistance

    ---恢复内容开始--- Resistance Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 1289   Accepte ...

  10. C/C++ XMPP/Jabber 客户端类库对比/点评 (转)

    原文转自 http://blog.csdn.net/educast/article/details/31359835 1.gloox Ans. 老牌库,推荐 gloox是一个稳定功能完整的XMPP客户 ...