python 基础4

无参装饰器:

不修改原函数,加入装饰器,在原有基础上包装函数

#!/usr/bin/env python
import time

def timer(fun):
    def wrapper(*args, **kwargs):
        start = time.time()
        res = fun(*args, **kwargs)
        end = time.time()
        print(‘run time is %s‘ % (end - start))
        return res
    return wrapper

@timer
def index(msg):
    print(‘in the index‘, msg)
    return 1

res = index
print(res(‘w‘))

res现在返回装饰器中的wrapper对象,但没有执行

res(‘w‘)这时传参数,并执行wrapper函数,到执行fun(*args,**kwargs),此时执行的是index(msg),最后完成整个函数体。

有参装饰器

#!/usr/bin/env python

user_list=[
    {‘name‘:‘alex‘,‘passwd‘:‘123‘},
    {‘name‘:‘linhaifeng‘,‘passwd‘:‘123‘},
    {‘name‘:‘wupeiqi‘,‘passwd‘:‘123‘},
    {‘name‘:‘yuanhao‘,‘passwd‘:‘123‘},
]

current_user={‘username‘:None,‘login‘:False}
def auth(auth_type=‘file‘):
    def auth_deco(func):
        def wrapper(*args,**kwargs):
            if auth_type == ‘file‘:
                if current_user[‘username‘] and current_user[‘login‘]:
                    res=func(*args,**kwargs)
                    return res
                username=input(‘用户名: ‘).strip()
                passwd=input(‘密码: ‘).strip()

                for index,user_dic in enumerate(user_list):
                    if username == user_dic[‘name‘] and passwd == user_dic[‘passwd‘]:
                        current_user[‘username‘]=username
                        current_user[‘login‘]=True
                        res=func(*args,**kwargs)
                        return res
                        break
                else:
                    print(‘用户名或者密码错误,重新登录‘)
            elif auth_type == ‘ldap‘:
                print(‘巴拉巴拉小魔仙‘)
                res=func(*args,**kwargs)
                return res
        return wrapper
    return auth_deco

#auth(auth_type=‘file‘)就是在运行一个函数,然后返回auth_deco,所以@auth(auth_type=‘file‘)
#就相当于@auth_deco,只不过现在,我们的auth_deco作为一个闭包的应用,外层的包auth给它留了一个auth_type=‘file‘参数
@auth(auth_type=‘ldap‘)
def index():
    print(‘欢迎来到主页面‘)

@auth(auth_type=‘ldap‘)
def home():
    print(‘这里是你家‘)

def shopping_car():
    print(‘查看购物车啊亲‘)

def order():
    print(‘查看订单啊亲‘)

# print(user_list)
index()
# print(user_list)
home()

有参装饰器就是在装饰器多加一层嵌套函数

模块:

import 模块

from 模块 import 方法

需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法

import 模块 as 重命名

from 模块 import *

#在模块文件写入 __all__=[‘money‘,‘read1‘] ,这样就指定*导入的方法了

当做脚本运行:
__name__ 等于‘__main__‘

作用:用来控制.py文件在不同的应用场景下执行不同的逻辑

添加脚本模块查找路径

base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir)  #将绝对路径临时添加到python变量里,这样就可以找到下面的包了

特别需要注意的是:可以用import导入内置或者第三方模块,但是要绝对避免使用import来导入自定义包的子模块,应该使用from... import ...的绝对或者相对导入,且包的相对导入只能用from的形式。

atm/
├── README.md
├── atm (ATM主程目录)
│   ├── __init__.py
│   ├── bin (ATM执行文件目录)
│   │   ├── __init__.py
│   │   ├── atm.py (ATM 执行程序)
│   │   └── manage.py (ATM 管理端)
│   ├── conf (配置文件)
│   │   ├── __init__.py
│   │   └── settings.py
│   ├── core (主要程序逻辑都在这个目录里)
│   │   ├── __init__.py
│   │   ├── accounts.py (用于从文件里加载和存储账户数据)
│   │   ├── auth.py (用户认证模块)
│   │   ├── db_handler.py (数据库连接引擎)
│   │   ├── logger.py (日志记录模块)
│   │   ├── main.py (主逻辑交互程序)
│   │   ├── manage_main.py (管理逻辑交互程序)
│   │   └── transaction.py (记账\还钱\取钱等所有的与账户金额相关的操作都在这)
│   ├── db (用户数据存储的地方)
│   │   ├── __init__.py
│   │   └── accounts (存各个用户的账户数据 ,一个用户一个文件)
│   │   └── 1234.json (一个用户账户文件)
│   │   └── account_id_record.json (一个用户账户id文件)
│   └── log
│   ├── __init__.py
│   ├── access.log
│   └── transactions.log
└── shopping_mall
└── __init__.py

bin下的atm.py是执行文件

# __author__:"wangyufu"

import os
import sys
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(base_dir)
sys.path.append(base_dir)

from core import main #会在sys.path下面找到core包导入main模块

if __name__ == ‘__main__‘:
    main.run()
时间: 2024-10-08 20:19:03

python 基础4的相关文章

linux+jmeter+python基础+抓包拦截

LINUX 一 配置jdk 环境 *需要获取root权限,或者切换为root用户 1.windows下载好,去 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 官方网站下载jdk(linux相应版本) 2.在usr目录下创建java路径文件夹 [root bin]cd /usr mkdir java 3.将jdk-8u60-linux-x64.tar.gz放到刚才创建的文件夹下

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

Python基础入门 (一)

一.关于版本的选择 Should i use Python 2 or Python 3 for my development activity?转载自Python官网 Short version: Python 2.x is legacy, Python 3.x is the present and future of the language Python 3.0 was released in 2008. The final 2.x version 2.7 release came out

Python 基础 - Day 4 Learning Note - Generator 生成器

列表生成器/列表解析 list comprehension 简单灵活地创建列表,通常和lambda(), map(), filter() 一起使用 通过列表生成式, 直接创建列表.但是,收到内容限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问几个元素,那其他的就白占空间.列表生成器能够一边循环一边计算,大大节省大量的空间.是生成器的一种. 只有调用,才能生成. 不支持切片操作,只能通过__next()___一个个取数字. 基本语法

python基础教程(第二版)

开始学习python,根据Python基础教程,把里面相关的基础章节写成对应的.py文件 下面是github上的链接 python基础第1章基础 python基础第2章序列和元组 python基础第3章使用字符串 python基础第4章字典 python基础第5章循环 python基础第6章函数和魔法参数 python基础第7章类 python基础第8章异常 python基础第9章魔法方法.属性和迭代器 python基础第11章文件 python基础第12章GUI(wxPython) pytho

python基础周作业

python基础周作业 1.执行python脚本的两种方法 脚本前面直接指定解释器 在脚本开始前声明解释器 2.简述位,字节的关系 每一个字节占用八个比特位 3, 简述ascii.unicode.utf- ‐8.gbk的关系 utf--‐8 <-- unicode <-- gbk <-- ascii 按此方向兼容 4..请写出"李杰"分别用utf- ‐8和gbk编码所占的位数 "李杰" 占用utf -8 占6字节 , gbk 占用4字节 5.pyt

Python基础(二)

Python基础(二) Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典.set集合) for 循环 enumrate range和xrange 编码与进制转换 Python 运算符 1.算术运算: 2.比较运算: 3.赋值运算: 4.逻辑运算:  5.成员运算: 基本数据类型 1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483

Python之路【第三篇】:Python基础(二)

Python之路[第三篇]:Python基础(二) 内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open. 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作.

Python之路【第二篇】:Python基础(一)

Python之路[第二篇]:Python基础(一) 入门知识拾遗 一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 1 2 3 if 1==1:     name = 'wupeiqi' print  name 下面的结论对吗? 外层变量,可以被内层变量使用 内层变量,无法被外层变量使用 二.三元运算 1 result = 值1 if 条件 else 值2 如果条件为真:result = 值1如果条件为假:result = 值2 三.进制 二进制,01 八进

Python学习笔记(一)python基础与函数

1.python基础 1.1输入与输出 输出 用print加上字符串,就可以打印指定的文字或数字 >>> print 'hello, world' hello, world >>> print 300 300 >>> print 100+200 300 print语句也可以跟上多个字符串,用逗号","隔开,就可以连成一串输出: >>> print 'The quick brown fox', 'jumps over