面向对象练习2

题目一:总结

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()

  

时间: 2024-10-23 19:41:55

面向对象练习2的相关文章

python学习 面向对象封装

from collectoins import namedtuplePoint=namedtuple('point',['x','y'])t1=Point(1,2)print(t1.x)print(t1.y)没有方法的类属性不会发生变化    定义简单 不能改变面向对象封装私有属性!!!私有方法!!!用装饰器描述的几个方法@property !!!@classmethod!!@staticmethod! 封装:class Teacher:     def __init__(self,name,p

python—面向对象的封装

封装 私有属性 class Teacher: __identifier = 'Teacher' #私有静态属性 def __init__(self,name,pwd) self.name = name self.__pwd = pwd #私有属性 内部使用,外部不能使用 def pwd(self): print(self.__pwd) alex = Teacher('alex','3714') alex.pwd() class Teacher: __identifier = 'Teacher'

python学习_day26_面向对象之封装

1.私有属性 (1)动态属性 在python中用双下划线开头的方式将属性隐藏起来.类中所有双下划线开头的名称,如__x都会自动变形成:_类名__x的形式.这种自动变形的特点是: a.类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果.b.这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的.c.在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆

python面向对象知识点疏理

面向对象技术简介 类: 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例.class 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且在函数体之外.类变量通常不作为实例变量使用. 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据. 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖,也称为方法的重写. 实例变量:定义在方法中的变量,只作用于当前实例的类. 继承:即一个派生类(de

php学习笔记 面向对象中[接口]与[多态性]的应用

代码如下: <?php /* 接口技术 * * 接口是一种特殊的抽象类,抽象类又是一种特殊的类 * * 接口和抽象类是一样的作用 * * 因为在PHP是单继承的,如果使用抽象类,子类实现抽象类就不能再去继承其他的类了 * * 如果既想实现一些规范,又想继承其他类.就要使用接口. * * 接口和抽象类的对比 * * 1.作用相同,都不能创建对象,都需要子类去实现 * * 2.接口的声明和抽象类不一样 * * 3.接口被实现方式不一样 * * 4.接口中的所有方法必须是抽象方法,只能声明抽象方法(不

php面向对象

面向对象 什么是面向对象? 面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程 序是由单个能够起到子程序作用的单元或对象组合而成,OOP达到了软件工程的三个目标:重用性.灵活性和扩展性.为了实现整体 运算,每个对象都能够接收信息.处理数据和向其它对象发送信息. 什么是面向对象编程呢? 把每个独立的功能模块抽象成类形成 对象,由多个对象组成这个系统,这些对象之间都能够接收信息.处理数据和向其它对象

面向对象注意事项

在面向对象中,有实例变量和类变量,实例变量为类对象的实例成员,而类变量不仅类可以直接调用,而且类的对象也可以调用.类对象可以对实例变量进行添加.修改.删除操作等... 下面就用个示例来做参考: #!/usr/bin/env python # -*- coding:utf-8 -*- class PersonInfo(object): commity_data = 123 def __init__(self,name,age): self.name = name self.age = age de

java面向对象:面向对象的思想和概述

1:面向对象思想 面向对象是基于面向过程的编程思想. 面向过程:强调的是每一个功能的步骤 面向对象:强调的是对象,然后由对象去调用功能 2:面向对象的思想特点 A:是一种更符合我们思想习惯的思想 B:可以将复杂的事情简单化 C:将我们从执行者变成了指挥者 开发,设计,特征 面向对象开发 就是不断的创建对象,使用对象,指挥对象做事情. 面向对象设计 其实就是在管理和维护对象之间的关系. 面向对象特征 封装(encapsulation) 继承(inheritance) 多态(polymorphism

6 面向对象之类和对象

1 面向对象和面向过程的区别 两者都是软件开发思想,先有面向过程,后有面向对象.在大型项目中,针对面向过程的不足推出了面向对象开发思想. 区别: 1)编程思路不同: 面向过程以实现功能的函数开发为主,而面向对象要首先抽象出类.属性及其方法,然后通过实例化类.执行方法来完成功能. 2)封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能. 3)面向对象具有继承性和多态性,而面向过程没有继承性和多态性,所以面向对象优势是明显. 2 类和对象 对象:客观存在的实体(一个具体的

简说面向过程与面向对象

昨天白天,因为在室外活动,无事可做,所以我思考了一天,在想怎么才能比较清晰的向人解释这两个概念.所以我对这两个概念的字面意思做了一下详细的解释.没想到,这可能真的会帮助我们非常简单的理解这两个概念. 面向:从字面上理解面向,就是我们的脸对着的地方,引申为我们能看到. 过程: 过程是事物从开始,到发展,到结束的整个经历 那么面向过程就是:我们能看到, 一个事物从 开始->发展->结束. 这对于我们写程序的人来说,可能会有感触,因为一开始我们写程序时.都是按照事件的发展.去安排计算机,一步一步的做