题目一:总结

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. ubuntu服务器与本地文件传输

    ubuntu SSH 连接.远程上传下载文件 博客分类: Ubuntu   安装 SSH(Secure Shell) 服务以提供远程管理服务 sudo apt-get install ssh SSH ...

  2. BZOJ 4552 [Tjoi2016&Heoi2016]排序 ——线段树 二分答案

    听说是BC原题. 好题,二分答案变成01序列,就可以方便的用线段树维护了. 然后就是区间查询和覆盖了. #include <map> #include <cmath> #inc ...

  3. getBoundingClientRect说明

    getBoundingClientRect用于获取某个元素相对于视窗的位置集合. 1.语法:这个方法没有参数. rectObject = object.getBoundingClientRect() ...

  4. Python Base Five

    // 8 day(2016/8/11) 38. In python , it is oop. class Baskball:         def setName(self, name):      ...

  5. STL学习笔记(七) 程序中使用STL

    条款43:算法调用优先于手写循环 class Widget { public: bool test(); }; vector<Widget> vec; 算法调用: for_each(vec ...

  6. 批处理命令之Start的详细用法

    Start启动单独的“命令提示符”窗口来运行指定程序或命令.如果在没有参数的情况下使用,start 将打开第二个命令提示符窗口. 语法start ["title"] [/dPath ...

  7. Android 禁止状态栏下拉status bar

    如果你有这样的需求:用户进入你的app以后,所有的操作都是你的app中设定的,用户不可以拥有系统设置等行为的能力.然而,Android系统,可以通过从顶部往下拉,从而得到一个通知和快速系统设置的页面: ...

  8. 解决win2008下IIS7的HTTP500错误

    造成500错误常见原因有:ASP语法出错.ACCESS数据库连接语句出错.文件引用与包含路径出错.使用了服务器不支持的组件如FSO等.另外,对于win2008的IIS默认不显示详细出错信息的问题以下就 ...

  9. PhPStorm 快捷键使用(转载)

    PhPStorm 是 JetBrains 公司开发的一款商业的 PHP 集成开发工具,PhpStorm可随时帮助用户对其编码进行调整,运行单元测试或者提供可视化debug功能.Phpstrom的一款名 ...

  10. MySQL创建存储过程/函数需要的权限

    alter routine---修改与删除存储过程/函数 create routine--创建存储过程/函数 execute--调用存储过程/函数 下面有一篇介绍MySQL所有权限的博文 http:/ ...