反射
用字符串来对应其同名的属性或者方法,通过某种方法调用这个字符串来执行方法或者获取属性
网络编程的时候非常好用,是很重要的内容 先看个示例吧:
 class Teather:
dic = {
"查看学生信息":"show_student",
"查看讲师信息":"show_teacher"
} def show_student(self):
print("学生:羊驼") def show_teacher(self):
print("讲师:羊驼") @classmethod
def func(cls):
print("ahahah") alex = Teather()
for k in Teather.dic:
print(k)
key = input("请输入指令:")
print(Teather.dic[key]) # 查看讲师信息 # 输出具体指令
print(type(Teather.dic[key])) # <class 'str'> # 字符串类型
getattr(alex,Teather.dic[key])() # 讲师:羊驼 # 通过字符串反射到同名方法执行得出结果

具体用到的方法:
  hassattr 判断属性或者方法是否存在
  getattr 字符串反射属性或者方法
  delattr 删除属性
  setattr  创建属性,如果存在则重新赋值,不存在则创建后赋值
 class A():
def __init__(self,name):
self.name = name def hi(self):
return f"hi~{self.name}~" a = A(name="lala")
print(hasattr(a,"name")) # True # 创建后存在此属性了
print(a.name) # lala
print(a.hi()) # hi~lala~ delattr(a,"name")
print(hasattr(a,"name")) # False # 删除属性后不存在此属性了
# print(a.name) # AttributeError: 'A' object has no attribute 'name'
# delattr(a,"hi") # AttributeError: hi # 不能删除对象的方法
print(a.hi())      # 删除了属性并不会影响这个实例调用其本就可以调用的其他方法,仅仅是失去那个属性 # a.name = "haha" # 直接创建赋值这样感觉最简单最方便
setattr(a,"name","haha") # setattr 其实和上面是等效的,但是用起来还麻烦些.
setattr(a,"age",19) # setattr 也可以做到创建未存在的属性不存在则添加并赋值
print(a.name) # haha
print(a.age) # str = "hi"
if hasattr(a,str): # 判断一下是否存在这个属性或者方法
print(getattr(a,str)()) # hi~haha~ # 从字符串反射过去方法执行结果



day28 反射 属性操作 getattr hasattr setattr delattr的更多相关文章

  1. Python笔记【7】_反射getattr&hasattr&setattr&delattr

    Lesson0402_GetatrrWebsite.py #!/usr/bin/env/python #-*-coding:utf-8-*- #Author:LingChongShi #查看源码Ctr ...

  2. Python自动化运维之13、异常处理及反射(__import__,getattr,hasattr,setattr)

    一.异常处理 python异常: python的运行时错误称作异常 (1)语法错误:软件的结构上有错误而导致不能被解释器解释或不能被编译器编译 (2)逻辑错误:由于不完整或不合法的输入所致,也可能是逻 ...

  3. (转)Python自动化运维之13、异常处理及反射(__import__,getattr,hasattr,setattr)

    原文:http://www.cnblogs.com/xiaozhiqi/p/5778856.html https://blog.csdn.net/zong596568821xp/article/det ...

  4. 反射(hasattr和getattr和setattr和delattr)

    目录 一.反射在类中的使用 1.1 应用 二.反射在模块中的使用 2.1 前言 2.2 反射机制 2.2.1 getattr() 2.2.2 hasattr(object, name) 2.2.3 s ...

  5. C# 反射之属性操作

    一.反射-类操作 //1.获取对象所有的属性名 Student stu = new Student(); //获取当前类名称 Console.WriteLine(stu.GetType().Name) ...

  6. python的反射函数(hasattr()、getattr()、setattr()与delattr())和类的内置属性attr(__getattr()__、__setattr()__与__delattr()__)

    主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省),有四个可以实现自省函数. hasattr(object,name) 判断object中是否有name字符串对应的属性或方法,返回Tr ...

  7. Python 反射机制之hasattr()、getattr()、setattr() 、delattr()函数

    反射机制 先看看我对Java中反射机制的通俗理解:反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化 ...

  8. isinstance/type/issubclass的用法,反射(hasattr,getattr,setattr,delattr)

    6.23 自我总结 面向对象的高阶 1.isinstance/type/issubclass 1.type 显示对象的类,但是不会显示他的父类 2.isinstance 会显示的对象的类,也会去找对象 ...

  9. hasattr、getattr、setattr、delattr、反射

    目录 hasattr getattr setattr delattr 反射的应用 __import__(了解) 思考: 在做程序开发中,我们常常会遇到这样的需求:需要执行对象里的某个方法,或需要调用对 ...

随机推荐

  1. GIT 分支管理:多人协作

    当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin. 要查看远程库的信息,用git remote: $ git r ...

  2. mac brew update 报错

    环境为mac, 总共报了三种错误. 对应三种不同的解法. 1.   第一种如下, 提示 1.8 的版本找不到 $ brew update /usr/local/bin/brew: /usr/local ...

  3. [转]Web 通信 之 长连接、长轮询(long polling)

    本篇文章转载自Web 通信之长连接.长轮询(longpolling),版权归作者所有. 转者按:随着技术的发展,在HTML5中,可以通过WebSocket技术来完成长连接的开发,虽然如此,本文依然存在 ...

  4. kill方法

    删除磁盘上的文件. 语法 Kill 路径名 所需的_路径名_参数是一个字符串表达式,指定要删除的一个或多个文件名. _Pathname_可能包括驱动器和目录或文件夹. 例子删除当前路径下的TXT文档 ...

  5. sql-server安装

    ubuntu安装sql-server https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-ubuntu?view ...

  6. Linux内核分析第五周学习总结

    扒开系统调用的三层皮(下) 20135237朱国庆+ 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...

  7. HTTP基础与Android之(安卓与服务器通信)——使用HttpClient和HttpURLConnection

    查看原文:http://blog.csdn.net/sinat_29912455/article/details/51122286 1客户端连接服务器实现内部的原理 GET方式和POST方式的差别 H ...

  8. 实现基于SSH的门票管理系统开发的质量属性

    我要做的是一个基于SSH的门票售卖系统,在系统中常见的质量属性有:可用性.可修改性.性能.安全性.易用性. 可用性方面: 可用性是指系统正常运行时间的比例,是通过两次故障之间的时间长度或在系统崩溃情况 ...

  9. let命令和块级作用域

    学习了阮一峰老师的ES6,http://es6.ruanyifeng.com/,收益良多. 一.let命令1.概念:let命令用于声明变量,和var类似,但是使用let命令所声明的变量只有在该变量所在 ...

  10. 软件工程导论课后习题Github作业(把一个英文句子中的单词次序逆序,单词中字母正常排列)

    Java源代码    package yly; import java.util.Scanner; public class ruanjian { public static void main(St ...