#反射
#描述:反射就是指在程序运行时,动态的去确定对象的类型,并且可以通过字符串的形式去调用对应的属性
# ,方法,导入模块,是一种基于字符串的事情驱动
# 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. springboot--多环境启动

    法一: 法二:

  2. Nacos 服务发现

    更多内容,前往 IT-BLOG 一.Nacos 简介 Nacos 是阿里的一个开源产品,它是针对微服务架构中的服务发现.配置管理.服务治理的综合型解决方案.Nacos 使服务更容易注册,并通过 DNS ...

  3. StringBuilder 导致堆内存溢出

    StringBuilder 导致堆内存溢出 原始问题描述: Exception in thread "main" java.lang.OutOfMemoryError: Java ...

  4. SaaS、PaaS、IaaS区别

    SaaS SaaS 越久,觉得它个庞大的领域 SaaS 收入的"长江流域". 传统软件像买房:什么都得自己买,价格昂贵,一般人用不起.SaaS模式就像是租赁预先装修好的共享公寓,拎 ...

  5. golang pprof 监控系列(3) —— memory,block,mutex 统计原理

    golang pprof 监控系列(3) -- memory,block,mutex 统计原理 大家好,我是蓝胖子. 在上一篇文章 golang pprof监控系列(2) -- memory,bloc ...

  6. 利用 kubeadm 创建 kubernetes (k8s) 的高可用集群

    引言: kubeadm提供了两种不同的高可用方案. 堆叠方案:etcd服务和控制平面被部署在同样的节点中,对基础设施的要求较低,对故障的应对能力也较低 堆叠方案 最小三个Master(也称工作平面), ...

  7. LeeCode 318周赛复盘

    T1: 对数组执行操作 思路:模拟 public int[] applyOperations(int[] nums) { int n = nums.length; for (int i = 0; i ...

  8. LeeCode数组问题:二分查找

    LeeCode 704 二分查找 题目描述: 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标, ...

  9. 帝国cms 随机调取新闻

    <?php $hits_r = $empire->query("select * from {$dbtbpre}ecms_music as t1 join (select rou ...

  10. 开心档之MySQL WHERE 子句

    MySQL WHERE 子句 我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据. 如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中. 语法 以下是 ...