#反射
#描述:反射就是指在程序运行时,动态的去确定对象的类型,并且可以通过字符串的形式去调用对应的属性
# ,方法,导入模块,是一种基于字符串的事情驱动
# 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. 在一张 24 GB 的消费级显卡上用 RLHF 微调 20B LLMs

    我们很高兴正式发布 trl 与 peft 的集成,使任何人都可以更轻松地使用强化学习进行大型语言模型 (LLM) 微调!在这篇文章中,我们解释了为什么这是现有微调方法的有竞争力的替代方案. 请注意, ...

  2. Android LineChart 折线图Demo

    1 首先在 build.gradle 里导入包 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' 2.新建 启动Activity Li ...

  3. grub 命令使用

    命令列表 ubuntu 的 iso 盘内一般有 command.lst 这个文件,里面是 grub 支持的命令 加载字体 ( 方便中文显示 ) grub> loadfont $prefix/fo ...

  4. Rainbond的 Gateway API 插件制作实践

    Gateway API 作为新一代的流量管理标准,对原有 Ingress 的扩展不规范.移植性差等问题做出了改进.从兼容K8s生态和优化网关体验出发,Rainbond 支持以插件的形式扩展平台网关能力 ...

  5. sealos踩坑记录

    前言 记录下我安装sealos的踩坑历程,全网基本没有什么类似的可靠资料,也许是因为太小众了吧,希望能帮助到搜索到此文的人. sealos是什么 Sealos 是以 kubernetes 为内核的云操 ...

  6. NodeJS 实战系列:个人开发者应该如何选购云服务

    这文章至少值一千元,因为这是我保守估计花出去的冤枉钱(请自行脑补一个苦笑的 emoji) 文章中会穿插选择云服务的一些建议,当然也会提供一些"薅羊毛"的技巧.不过在此之前我们要想清 ...

  7. 线性规划与整数规划—R实现

    线性规划的R语言实现 R语言在针对各类优化模型时都能快速方便的求解,对运输问题.生产计划问题.产销问题和旅行商问题等都有专门的R包来解决.线性规划与整数规划的区别主要在于对决策变量的取值约束有所不同. ...

  8. [数据库/MYSQL]#解决缺陷#设置Unique索引时:"[Err] 1071 - Specified key was too long; max key length is 767 bytes"

    1 问题复现 原表结构: CREATE TABLE `XX_TEMPERATURE` ( `FLOW_ID` int(11) NOT NULL COMMENT '独立的数据表或FTP唯一标识', -- ...

  9. [MySQL]set autocommit=0与start transaction的区别[转载]

    set autocommit=0指事务非自动提交,自此句执行以后,每个SQL语句或者语句块所在的事务都需要显示"commit"才能提交事务. 1.不管autocommit 是1还是 ...

  10. Semantic Kernel 入门系列:📅 Planner 计划管理

    Semantic Kernel 的一个核心能力就是实现"目标导向"的AI应用. 目标导向 "目标导向"听起来是一个比较高大的词,但是却是实际生活中我们处理问题的 ...