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

      

  • 相关阅读:
    codeforces 980A Links and Pearls
    zoj 3640 Help Me Escape
    sgu 495 Kids and Prizes
    poj 3071 Football
    hdu 3853 LOOPS
    hdu 4035 Maze
    hdu 4405 Aeroplane chess
    poj 2096 Collecting Bugs
    scu 4444 Travel
    zoj 3870 Team Formation
  • 原文地址:https://www.cnblogs.com/Michael--chen/p/6749080.html
Copyright © 2011-2022 走看看