python学习笔记-Day5(反射、特殊方法、OS模块)

反射

# 反射(或叫自省): 有时候我们会碰到这样的需求,需要执行对象的某个方法,或是需要对对象的某个字段赋值,而方法名或是字段名在编码代码时并不能确定,需要通过参数传递字符串的形式输入
# 这就是我们反射功能: 通过字符串形式去调用对象

# 例, 我有一个导向页面commons.py
def login():
    print(‘登录‘)

def home():
    print(‘HOME PAGE‘)

def logout():
    print(‘logout !!!‘)

# 我需要根据用户输入,去执行对应功能,使用反射就可以这么写
# index.py
import commons
def run():
    inp = input(‘请输入要访问的url: ‘)
    if hasattr(commons, inp):
        func = getattr(commons,inp)
        func()
    else:
        print(‘404‘)

run()

# 例如,我在inp执行时输入login执行过程为下
# hasattr(commons, ‘login‘) ,表示commons.login是否存在,存在则返回True
# func = getattr(commons, ‘login‘) ,表示将commons.login对象完全赋值给func
# func() 调用执行对象

# 这里反射涉及两个内置函数:
# hasattr()  判断接收字符串是否存在
# getattr()  获取接收字符串对象
# 上边反射了,某个模块的函数,而实际我们还可以连模块一起反射
# __import__() 以字符串形式导入模块
# 这样我们就可以这样改下我们run()函数

def run():
    inp = input(‘请输入要访问的url: ‘)  # 用户输入格式为  模块/函数
    m, f = inp.split(‘/‘)   # 将用户输入分为模块和函数
    obj = __import__(m)    # 以字符串形式导入模块
    if hasattr(obj, f):   # 判断模块中是否有此函数
        func = getattr(obj, f)   # 获取模块函数体
        func()   # 执行函数
    else:
        print(‘404‘)

# 反射中还有以下两个内置函数# setattr() 找到模块中,再设置一个函数对象# delattr() 找到模块中,删除函数对象

注意: 我们上边例子hasattr()、getattr()、setattr()、delattr(),都是至少传入两个参数的(对象、名字)

# __import__ 导入模块特例

s = ‘lib.test‘
obj = __import__(s)
# 这时,import仅仅是import lib
# 要使用:
# obj = __import__(s, fromlist=True)
# 才可以支持多级目录式导入模块

特殊方法

__file__  # 本文件的相对路径
__package__ # 文件在你的相对哪个路径下

# 例如,我的程序如下
|--bin
|   |--test.py
|--index.py

# index.py
from bin import bin

print(bin.__package__)

==> bin  # 输出相对路径,就是这个,看起来毫无卵用的功能

__cache__ # 关于Pyc文件的特殊方法

OS模块

# 我的代码当前路径为:D:\MyCloud\oldboy\day6_0611

r = os.path.abspath(__file__)  # 当前文件的绝对路径
print(r)

==> D:/MyCloud/oldboy/day6_0611/test2.py

s = os.path.dirname(r) # 文件(或目录)所在的目录的相对路径
print(s)

==> D:\MyCloud\oldboy\day6_0611\test2.py
# 这里因为pycharm原因,默认显示绝对路径,应该你在哪个路径下,它就显示相对与你执行此程序的路径

sys.path.append(os.path.dirname(r))  # 将当前文件目录(r),添加到系统PATH变量
时间: 2025-01-01 01:58:53

python学习笔记-Day5(反射、特殊方法、OS模块)的相关文章

python 学习笔记 13 -- 经常使用的时间模块之time

Python 没有包括相应日期和时间的内置类型.只是提供了3个相应的模块,能够採用多种表示管理日期和时间值: *    time 模块由底层C库提供与时间相关的函数.它包括一些函数用于获取时钟时间和处理器的执行时间,还提供了基本解析和字符串格式化工具 *    datetime 模块为日期.时间以及日期时间值提供一个更高层接口. datetime 中的类支持算术.比較和时区配置. *    calendar 模块能够创建周.月和年的格式化表示. 它还能够用来计算反复事件.给定日期是星期几,以及其

python学习笔记day5——常用模块学习

一.主要内容 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configparser hashlib subprocess logging模块 re正则表达式 二.具体内容 1.模块 a.定义:本质就是.py结尾的python文件,逻辑上组织python代码,实现某种功能.例:文件名test.py-->模块名test. b.导入方法:imort moduname from mdn

python学习笔记-Day08--(反射)

从一开始学习这一块感觉blog就比较难写,本来就不太会写博客的问题就更严重了. 想不出什么形象的比喻.所以要写blog的时候我的心情是这样的,但是我的心情应该调整成这样的. 还是用上课时举的例子来说明白. 首先说明一下,反射要用到内置函数, getattr(obj,name)hasattr(obj,name)delattr(obj,name)  #操作内存,不影响文件,很少使用setattr(obj,name)  #操作内存,不影响文件,很少使用 先看一下getattr()方法的说明 getat

Python学习笔记——Day5(转载)

python 编码转换 主要介绍了python的编码机制,unicode, utf-8, utf-16, GBK, GB2312,ISO-8859-1 等编码之间的转换. 常见的编码转换分为以下几种情况: 自动识别 字符串编码 可以使用 chardet 模块自动识别 字符创编码 chardet 使用方法 unicode 转换为其它编码(GBK, GB2312等) 例如:a为unicode编码 要转为gb2312.a.encode('gb2312') # -*- coding=gb2312 -*-

Python学习笔记之基本数据结构方法

通用序列操作: 索引,序列中元素从0开始递增,这些元素可以通过编号访问 分片,使用索引只能访问单个元素,分片操作可以访问一定范围内的元素.list[a:b]:a和b是两个索引作为边界,包含索引a对应函数,不包含b 序列相加,两种相同的序列才能进行连接操作 >>> a = [1,2,3] >>> b = [4,5,6] >>> a + b [1, 2, 3, 4, 5, 6]>>> 'hello' + 'world''helloworl

python学习笔记五:字符串方法

常用字符串常量: string.digits:包含数字0~9的字符串 string.letters:包含所有字母(大写或小写字符串,在python3.0中,使用string.ascii-letters代替) string.lowercase:包含所有小写字母的字符串 string.printable:包含所有可打印字符的字符串 string.punctuation:包含所有标点的字符串 string.uppercase:包含所有大写字母的字符串 1)find:在较长的字符串中查找子串,返回子串所

python学习笔记(time.time方法)

time.time()方法 返回的是 1970纪元后经过的浮点秒数 比较简单 总结如下: 1 #!/usr/bin/env python 2 # -*- coding: utf_8 -*- 3 4 import time 5 6 print time.time() 7 print time.localtime(time.time()) 8 print time.asctime(time.localtime(time.time()))

python学习笔记-Day5

字符串格式化 # 字符串格式化之%占位符 # a. 位置 s = 'i am %s age %d' % ('eason', 18) print(s) ==> i am eason age 18 # 传入可迭代的对象,%占位符会根据迭代传入顺序给字符串赋值 # b. 字典 s = 'i am %(name)s age %(age)d' % {'name':'eason','age':18} print(s) ==> i am eason age 18 # 每一个%占位符会起一个名字,传入一个字典

python学习笔记__反射

反射 # 通过字符串的形式对对象中的成员进行操作(获取/查找/添加/删除). 操作的内置函数: 1.获取   getattr(object, name) # 去对象object中获取name的内容 class Foo: def __init__(self, name, age): self.name = name self.age = age obj = Foo('Lemon147', 18) v = getattr(obj, 'name') print(v) >>> Lemon147