zoukankan      html  css  js  c++  java
  • Python关于类的实操

      实操一:总结

      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作为参数传给调用函数
    

      

  • 相关阅读:
    【线性表2】线性表的顺序实现:顺序表
    【JSP】EL函数和自定义EL函数
    移动架构-策略模式
    移动架构-状态模式
    移动架构-观察者模式
    移动架构-模板模式
    移动架构-解释器模式
    移动架构-命令模式
    移动架构-责任链模式
    移动架构之建造者模式
  • 原文地址:https://www.cnblogs.com/Michael--chen/p/6749080.html
Copyright © 2011-2022 走看看