题目一:总结

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. install chrome on ubuntu14.04

    summary chrome broswer can't found in ubuntu14.04 default source list.To install chrome ,you must ad ...

  2. Collection类及常用API

    Collection类及常用API Collection—类集工具类,定义了若干用于类集和映射的算法,这些算法被定义为静态方法,具体查看api文档; a)  public static void so ...

  3. MySQL可供选择的存储引擎

    备注:以下关于5.7版本的内容是来源于官方文档:https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html 以下关于5.6版本的内容,一部 ...

  4. 九度oj 题目1085:求root(N, k) 清华2010年机试题目

    题目描述: N<k时,root(N,k) = N,否则,root(N,k) = root(N',k).N'为N的k进制表示的各位数字之和.输入x,y,k,输出root(x^y,k)的值 (这里^ ...

  5. BZOJ1297 [SCOI2009]迷路 【矩阵优化dp】

    题目 windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同的路径吗? 注意: ...

  6. BZOJ3507 [Cqoi2014]通配符匹配 【哈希 + 贪心】

    题目 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个 是星号(""'),可以匹配0个及以上的任意字符:另一个是问号(&quo ...

  7. python tab 自动补全

    学习python,经常要使用python命令行查找一些不熟悉的使用方法等等,但是python命令行下没有自带tab补全的功能,看见别人写了tab,可以解决特此记下,以备后用 1.创建tab.py文件, ...

  8. linux jenkins安装(四)

    Jenkins是基于Java开发的一种持续集成工具,用于监控秩序重复的工作,包括:软件版本发布/测试的持续集成.外部调用执行工作的监控等. 1. Jenkins 下载 Jenkins 下载网址:htt ...

  9. scrapy的调试方法

    Parse命令,Scrapy shell,logging 一 Parse命令 检查spider输出的最基本方法是使用Parse命令.这能让你在函数层上检查spider哥哥部分的效果,其十分灵活并且已用 ...

  10. FOJ Problem 2253 Salty Fish

                                                                                                        ...