实操一:总结

  1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性?

  2.什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性?

  3.什么是解除绑定的函数,如何定义,如何调用,给谁用?有什么特性?

  4.什么是property,如何定义,如何使用,给谁用,什么情况下应该将一个属性定义成property,有什么好处?

  答:1、对象的绑定方法:在定义一个类后,类下面有一个函数属性,实例化对象后,这个函数属性对对象而言,就

是绑定方法。主要针对的是对象调用的时候,对象名.绑定方法名加括号就能调用,注意:绑定方法的第一个参数,是默

认将对象作为第一个参数传进去的,不用自己传,后面在有多少参数,就穿多少参数。

    2、类的绑定方法:就是类方法,在类里面把一个方法绑定给类,说白了类方法是给类用的,该方法由装饰器

@classmethod所装饰,主要针对的是类调用的时候,类名.绑定到类的方法名加括号就能调用,注意:绑定方法的第一个

参数,是默认将类名作为第一个参数传进去的,不用自己传,后面在有多少参数,就穿多少参数。

    3、解除绑定的函数:就是静态方法,是一种普通函数,在类的作用域里面时,不会对任何实例类型进行操作,

前面必须要加上一个装饰器@staticmethod,我们将这种方法就称为静态方法。在调用的时候,都按照普通函数的调用

方式,没有了自动传值功能。

    4、property是Python里面的一个内置函数,property是一种特殊的属性,访问它时会执行一段功能(函数)

然后返回值(就是一个装饰器),既然是装饰器,就按照装饰器的用法。给对象使用,将一个函数定义成一个特性之后,

对象再去使用绑定方法的时候就不用加括号了,就跟使用数据属性一样了,但是,函数内部会执行代码,返回设好的执行

结果。扩展性变强了,提供set和get方法(接口)去设置和获取,在python中通过property方法实现。

  实操二

  要求一:自定义用户信息数据结构,写入文件,然后读出内容,利用eval重新获取数据结构:

with open('user.db','w') as write_file:
write_file.write(str({
"egon":{"password":"123",'status':False,'timeout':0},
"alex":{"password":"456",'status':False,'timeout':0},
})) with open('user.db','r') as read_file:
data=read_file.read()
d=eval(data)
print(d['egon']['password'])
print(d['egon']['status'])
print(d['egon']['timeout'])
------------------输出结果------------------------
123
False
0

  要求二:定义用户类,定义属性db,执行obj.db可以拿到用户数据结构:

class User:
db_path='user.db'
def __init__(self,username):
self.username=username
@property
def db(self):
data=open(self.db_path,'r').read()
return eval(data) u=User('egon')
print(u.db['egon'])
print(u.db['egon']['password'])
------------------输出结果------------------
{'password': '123', 'status': False, 'timeout': 0}
123

  要求三:分析下述代码的执行流程:

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):
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秒') u1=User('egon')
u1.login() 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 login(self):
data=self.db
if data[self.name]['status']: #判断status的状态,查看是否是登录状态
print('已经登录')
return True
if data[self.name]['timeout'] < time.time():#没有锁定的用户
count=0
while count < 3: #循环不能超过3次
passwd=input('%s password>>: '%self.name) #输入密码
if not passwd:continue #密码不对重新输入
if passwd == data[self.name]['password']: #密码对的时候
data[self.name]['status']=True #修改status的状态
data[self.name]['timeout']=0 #修改timeout的值
self.db=data #将修改后的值重新赋值给data
print("Welcome , %s"%self.name)
break
count+=1
else:
data[self.name]['timeout']=time.time()+10 #输错达到三次时,将当前时间+10s,重新赋值给timeout
self.db=data #将修改后的值重新赋值给data
else:
print("This account has been locked,Please try again after %s seconds"
%(int(data[self.name]['timeout'] - time.time()))) #提示锁定还剩多长时间
@property
def quit_pro(self): #用户退出程序
data = self.db
if data[self.name]['status']: #判断status的状态,查看是否是登录状态,是,提示是否退出
choice = input("%s,已经登录, whether to quit(Y/N) >>>:"%self.name) #提示选择
if choice.upper() == "Y": #.upper()统一大小写
data[self.name]['status'] = False #更改status的状态
self.db = data #把状态保存到data
print("%s ,quit"%self.name)
elif choice.upper() == "N": #.upper()统一大小写
return
else: #用户没有登录状态时,走下面代码
if data[self.name]['timeout'] > time.time(): #判断是否为锁定用户
print("%s ,quit,Please try again after %s seconds" %
(self.name,int(data[self.name]['timeout'] - time.time())))#提示锁定还剩多长时间
return
else: #没有锁定的用户,直接退出
print("%s ,quit"%self.name)
#以下是用户交互阶段
def tell_choice():
'''用户输入提示'''
mag = '''
1 login
2 quit_pro
'''
print(mag)
#定义调用阶段的主函数
def login(obj): #登录主函数
obj.login
def quit_pro(obj): #退出主函数
obj.quit_pro
my_dic = {"1":login,"2":quit_pro} #供用户选择的字典
while True: #用户交互模式
tell_choice() #调用用户输入提示函数
choice = input("请输入实例化对象的name:")
if choice == "q": #退出
break
else:
u1 = User(choice) #实例化对象u1
choice1 = input("请输入您想要的操作:")
if choice1 == "1": #调用登录的函数
my_dic[choice1](u1) #将实例化对象u1作为参数传给调用函数
elif choice1 == "2": #调用退出的函数
my_dic[choice1](u1) #将实例化对象u1作为参数传给调用函数

  

Python关于类的实操的更多相关文章

  1. python 学习分享-购物车实操篇

    程序要求如下: '''购物车程序: 启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就 ...

  2. Python相关分析—一个金融场景的案例实操

    哲学告诉我们:世界是一个普遍联系的有机整体,现象之间客观上存在着某种有机联系,一种现象的发展变化,必然受与之关联的其他现象发展变化的制约与影响,在统计学中,这种依存关系可以分为相关关系和回归函数关系两 ...

  3. 动手实操:如何用 Python 实现人脸识别,证明这个杨幂是那个杨幂?

    当前,人脸识别应用于许多领域,如支付宝的用户认证,许多的能识别人心情的 AI,也就是人的面部表情,还有能分析人的年龄等等,而这里面有着许多的难度,在这里我想要分享的是一个利用七牛 SDK 简单的实现人 ...

  4. 决策树算法的Python实现—基于金融场景实操

    决策树是最经常使用的数据挖掘算法,本次分享jacky带你深入浅出,走进决策树的世界 基本概念 决策树(Decision Tree) 它通过对训练样本的学习,并建立分类规则,然后依据分类规则,对新样本数 ...

  5. 如何练习python?有这五个游戏,实操经验就已经够了

    现在学习python的人越来越多了,但仅仅只是学习理论怎么够呢,如何练习python?已经是python初学者比较要学会的技巧了! 其实,最好的实操练习,就是玩游戏. 也许你不会信,但这五个小游戏足够 ...

  6. Python实操二

    实操一: 1.用map来处理字符串列表啊,把列表中所有人都变成sb,比方alex_sb name=['alex','wupeiqi','yuanhao'] name=['alex','wupeiqi' ...

  7. Selenium之unittest测试框架详谈及实操

    申明:本文是基于python3.x及selenium3.x. unittest,也可以称为PyUnit,可以用来创建全面的测试套件,可以用于单元自动化测试(模块).功能自动化测试(UI)等等. 官方文 ...

  8. unittest测试框架详谈及实操(二)

    类级别的setUp()方法与tearDown()方法 在实操(一)的例子中,通过setUp()方法为每个测试方法都创建了一个Chrome实例,并且在每个测试方法执行结束后要关闭实例.是不是觉得有个多余 ...

  9. HDFS集群PB级数据迁移方案-DistCp生产环境实操篇

    HDFS集群PB级数据迁移方案-DistCp生产环境实操篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 用了接近2个星期的时间,终于把公司的需要的大数据组建部署完毕了,当然,在部 ...

随机推荐

  1. 【译】第十篇 SQL Server安全行级安全

    本篇文章是SQL Server安全系列的第十篇,详细内容请参考原文. 不像一些其他industrial-strength数据库服务,SQL Server缺乏一个内置保护个别数据记录的机制,称为行级安全 ...

  2. Django REST framework 第三章 CBV

    从介绍Django快开始,我们就一直在使用FBV的方式来撰写代码,二者本质上并没有太大的区别,然而到了REST framework,更会倾向于用CBV来写API的视图,后面会看到这个方式的强大,它允许 ...

  3. 【深入分析Java Web技术内幕】1、深入Web请求过程知识点

    如何发起一个请求 发起一盒HTTP请求的过程就是建立一个Socket通信的过程! 既然发起一个HTTP的本质就是建立一个Socket连接,那么我们完全可以模拟浏览器来发起HTTP请求,这很好实现,如H ...

  4. MongoDB 学习手册 - 安装(windwos 环境)

  5. RabbitMQ简单应用の公平分发(fair dipatch)

    公平分发(fair dipatch)和轮询分发其实基本一致,只是每次分发的机制变了,由原来的平均分配到现在每次只处理一条消息 1.MQ连接工厂类Connection package com.mmr.r ...

  6. python zip文件压缩和解压

    压缩 import shutil zipOutputName = "1234" # 输出1234.zip fileType = "zip" # 文件类型zip ...

  7. 二层环路保护,RRPP多环的配置

    作者:邓聪聪 组网需求: 局域网中,由A/B/C/D构成RRPP域1换网络结构,要求环网机构中的任意两条线路中断都不能影响业务. 配置思路: 环路由两部分组成,ring1.ring2,B为环1的主节点 ...

  8. boost 实现http断点续传

    // testc.cpp : Defines the entry point for the console application. // #include "stdafx.h" ...

  9. boost 文件系统

    第 9 章 文件系统 目录 9.1 概述 9.2 路径 9.3 文件与目录 9.4 文件流 9.5 练习  该书采用 Creative Commons License 授权 9.1. 概述 库 Boo ...

  10. linux 分区方案

    背景 之前安装过linux好多次,也学习过好几次,竟然也是一直没开窍,这次不知为啥醒悟了.了解了linux的分区道道.总结起来就是分区主要是根目录(类似c盘),swap,boot(必须有的,  win ...