#反射
#描述:反射就是指在程序运行时,动态的去确定对象的类型,并且可以通过字符串的形式去调用对应的属性
# ,方法,导入模块,是一种基于字符串的事情驱动
# class User:
# def __init__(self,):
# self.username='wang'
# self.userpwd=123
# obj1=User()
#我们平时使用方式,都是这样
# content=input('>>>:')
# if content=='username':
# print(obj1.username)
# elif content=='price':
# print(obj1.userpwd)
#但是上面的方法,我们如果调用成百上千的方法和属性,所以就有了反射这种方法
#python 提供了几个内置函数来这种事情 getattr(), hasattr()
# 对象的反射
# getattr(对象,字符串形式属性或方法名称)返回对象总属性名对应的值
# hasattr(对象,字符串形式属性或方法名称) 返回的是一个boo1 值,判断对象中是否存在属性
# 反射属性
# val=getattr(对象,'属性名') val就是属性的值
# 增加
class User:
def __init__(self,):
self.username='wang'
self.userpwd=123
obj1=User()
content=input('>>>:')
if hasattr(obj1,content): # 判断obj1对象中是否存在改属性
ret=getattr(obj1,content) # 对象和输入的字符串
print(ret)
# 反射方法 :方法的反射如果我们使用上面属性的反射的,会有问题;属性是不用加括号,但方法必须加括号才能返回
#callable() # 判断参数是否可以调用

class User:
def __init__(self,):
self.username='wang'
self.userpwd=123
def show__show(self):
print(self.username,self.userpwd)
obj1=User()
content=input('>>>:')
if hasattr(obj1,content): # 判断obj1对象中是否存在改属性
ret=getattr(obj1,content) # 对象和输入的字符串
if callable(ret): # 判断ret是否可调用,因为有可能是一个内存地址
ret()
else:
print(ret)
# 类的反射
#举例;
class A:
country='china'
print(getattr(A,'country'))
# 不但对类反射,类变量也可以反射
# 模块反射
import time
print(time.time)
print(getattr(time,'time')())
#反射应用的综合实例:
import  pickle
class Account:
opt_lst=[('登录','login'), ('注册','regiest' ),('退出','exit')]
def __init__(self):
self.dic={'username':'','userpwd':'' } # 构建字典格式: dic{ id: {username:'',userpwd:''}}
def login(self):
username=input('请输入用户:').strip()
userpwd=input('请输入密码:').strip()
with open('usernamelist',mode='rb') as f:
self.dic=pickle.load(f)
print(self.dic)
if username==self.dic['username'] and userpwd==self.dic['passwd']:
print('登录成功')
else:
print('用户名或者密码密码错误')
def regiest(self):
while True:
username=input("请输入用户名:").strip()
with open('usernamelist',mode='rb') as f:
try:
self.dic=pickle.load(f)
except:EnvironmentError
if username not in self.dic['username']:
while True:
userpwd=input("请输入用户密码:").strip()
userpwd2=input('请再次输入密码:').strip()
if userpwd==userpwd2:
self.dic.update(username=username,userpwd=userpwd)
with open('usernamelist',mode='ab') as f:
pickle.dump(self.dic,f)
break
else:
print('二次密码输入不一致,请重试输入秘密')
return True
else:
print('请更换其他用户名进行注册')
def run(self):
while True:
for index,lst in enumerate(Account.opt_lst,1):
print( Account.opt_lst[0][0],index)
num=int(input('请输入相关选择:').strip())
if hasattr(obj, Account.opt_lst[num - 1][1]):
getattr(obj, Account.opt_lst[num - 1][1])()

if __name__=='__main__':
obj=Account()
obj.run()

python -----类反射的更多相关文章

  1. Python类总结-反射及getattr,setattr

    类反射的四个基本函数 hasattr getattr setattr delattr #反射 class BlackMedium: feature = 'Ugly' def __init__(self ...

  2. python 类知识点总结

    python 类知识点总结 面向对象思想: 1.设计的时候,一定要明确应用场景 2.由对象分析定义类的时候,找不到共同特征和技能不用强求 1.简述类.对象.实例化.实例这些名词的含义: 类:从一组对象 ...

  3. python类:magic魔术方法

    http://blog.csdn.net/pipisorry/article/details/50708812 魔术方法是面向对象Python语言中的一切.它们是你可以自定义并添加"魔法&q ...

  4. (转)python类:magic魔术方法

    原文:https://blog.csdn.net/pipisorry/article/details/50708812 版权声明:本文为博主皮皮http://blog.csdn.net/pipisor ...

  5. day7-python类反射

    一.概述 一般的高阶语言都有反射的功能特性,python也不例外,网上资料显示,python支持类反射和模块反射,今天就先学习一下类反射的相关知识,模块反射后续再展开把.Python的类反射用于把字符 ...

  6. 如何访问python类中的私有方法

    在python中,不像c#/java类语言,支持类的私有方法,这点有点像objc,虽然objc可以通过扩展extension来实现,但源于objc的运行时特性,我们还是可以通过非常手段来进行访问的.不 ...

  7. python类的相关知识第二部分

    类的继承.多态.封装 一.类的继承 1.应用场景: 类大部分功能相同,大类包含小类的情况 例如: 动物类 共性:都要吃喝拉撒.都有头有脚 特性: 猫类.走了很轻,叫声特别,喜欢白天睡觉 狗类.的叫声很 ...

  8. Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究

    Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: ​ 反射的概念是由Smith在1982年首次提出的 ...

  9. Python类中super()和__init__()的关系

    Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...

  10. LightMysql:为方便操作MySQL而封装的Python类

    原文链接:http://www.danfengcao.info/python/2015/12/26/lightweight-python-mysql-class.html mysqldb是Python ...

随机推荐

  1. BGF bivariate generating function 双变量生成函数

    目录 定义 BGF bivariate generating function horizonal GF 和 vertical GF 例子 组合数 horizonal GF vertical GF ( ...

  2. vite项目生产环境去掉console信息【转载】

    环境变量引入 通常去掉console为生产环境,即需要引入环境变量.具体请看这篇文章: vite项目初始化之~环境变量 注意 与webpacak相比,vite已经将这个功能内置到了,所以我们只需要配置 ...

  3. Opengl ES之矩阵变换(上)

    前言 说到矩阵变换,我们第一时间想到的就是大学时代的线性代数这些复杂的东西,突然有了一种令人从入门到放弃的念头,不慌,作为了一个应用层的CV工程师, 在实际应用中线性代数哪些复杂的计算根本不用我们自己 ...

  4. 10 个杀手级的 Python 自动化脚本

    重复性任务总是耗时且无聊,想一想你想要一张一张地裁剪 100 张照片或 Fetch API.纠正拼写和语法等工作,所有这些任务都很耗时,为什么不自动化它们呢?在今天的文章中,我将与你分享 10 个 P ...

  5. Mysql 局域网远程连接设置——Windows

    工作中,遇到mysql数据库存储于我的电脑上,而其他电脑需要共同进行读写数据(类似redis并发),所以我的电脑就必须开启mysql远程连接. 一. 授权 1. 连接数据库 mysql -uroot ...

  6. 安装部署keepalived的HA环境

    每一台配置下keepalived #master01 配置: cat >/etc/keepalived/keepalived.conf<<"EOF" ! Conf ...

  7. linux 安装 node 和 npm 服务

    1.安装文件下载 下载地址:https://nodejs.org/zh-cn/download/ 2.安装步骤 1.将安装包上传到指定位置(我习惯放到:/usr/local/application/目 ...

  8. 彻底解决VSCode无法远程ssh,提示The remote host may not meet VS Code Server‘s prerequisites for glibc and libstdc++

    彻底解决VSCode无法远程ssh,提示The remote host may not meet VS Code Server's prerequisites for glibc and libstd ...

  9. count(*) count(1) count(字段)效率问题

    COUNT(字段名)和COUNT(*)的查询结果有什么不同? COUNT(1)和COUNT(*)之间的效率哪个更高? 你知道答案吗?很多人都认为COUNT(1)比COUNT(*)效率高,真的是这样吗? ...

  10. MAPPO学习笔记(1):从PPO算法开始

    由于这段时间的学习内容涉及到MAPPO算法,并且我对MAPPO算法这种多智能体算法的信息交互机制不甚了解,于是写了这个系列的笔记,目的是巩固知识,并且进行一些粗浅又滑稽的总结. 1.PPO算法的介绍 ...