#反射
#描述:反射就是指在程序运行时,动态的去确定对象的类型,并且可以通过字符串的形式去调用对应的属性
# ,方法,导入模块,是一种基于字符串的事情驱动
# 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. 实现hypothesis在网页标注后同步到本地obsidian

    实现hypothesis在网页标注后同步到本地obsidian 遇到的question 2023.3.21日 在更改了自己的模板之后,可以能按照Todo的方式展现所有的标记,但是发现在同一个网页上增加 ...

  2. Quicker快速开发,简单的网页数据爬取(示例,获取天眼查指定公司基础工商数据)

    前言 有某个线上项目,没有接入工商接口,每次录入公司的时候,都要去天眼查.企查查或者其他公开数据平台,然后手动录入,一两个还好说,数量多了的重复操作就很烦,而且,部分数据是包含超链接,一不注意就点进去 ...

  3. 亚马逊商品页面爬取(使用headers字段).py(亲测有效)

    import requests def getHTMLText(url): try: kv = {'user-agent':'Mozilla/5.0'} # 请求头;指定访问浏览器为Mozilla5. ...

  4. mac tip---->开发的tip

    delete webstorm Besides we delete the Webstorm App, We also need to delete related config or log dir ...

  5. nginx+vite 项目打包及部署到服务器二级路由

    项目打包及部署到服务器二级路由 例如:我希望将打包的项目部署到 http://localhost:8088/web/ 上 一. 项目配置及打包 项目部署到服务器二级路由需要配置基础路径base,即需要 ...

  6. Linux服务器MySQL操作总结

    目录 1. Navicat连接服务器MySQL 2. 如何查看MySQL用户名和密码 3. 修改MySQL的登录密码 4. 安装MySQL开发包(Centos7版) 错误:error 1045 (28 ...

  7. [Linux]监控外部用户登录及外部主机连接情况

    1 外部用户/外部主机 /var/log 在CentOS系统上,用户登录历史存储在以下这些文件中: /var/log/wtmp 用于存储系统连接历史记录被last工具用来记录最后登录的用户的列表 /v ...

  8. day07 字符串和列表

    day07字符串与列表 字符串的内置方法 lower upper startswitch endwhich 格式化输出 format join的用法 replace替换字符串 isdigit判断 字符 ...

  9. LeeCode 动态规划(四)

    LeeCode 动态规划(四) LeeCode 198:打家劫舍 题目描述 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系 ...

  10. XXL-JOB定时任务框架(Oracle定制版)

    特点 xxl-job是一个轻量级.易扩展的分布式任务调度平台,能够快速开发和简单学习.开放源代码并被多家公司线上产品使用,开箱即用.尽管其确实非常好用,但我在工作中使用的是Oracle数据库,因为xx ...