Python类(五)-反射
反射即通过字符串映射或修改程序运行时的状态、属性、方法
有4个方法:
hasattr():
hasattr(object,string):object为实例化的对象,string为字符串
判断对象object里是否有对应字符串string的方法或属性,返回布尔型
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" class Person(object):
def __init__(self,name):
self.name = name def eat(self):
print('%s is eating '%self.name) if __name__ == '__main__':
p = Person('John') #实例化Person类
argu = input(">>>:").strip()
print(hasattr(p,argu))
运行,输入name
类中有name这个属性,返回True

输入eat
类中有eat这个方法,返回True

输入test
类中没有test这个属性和方法,返回False

getattr():
getattr(object,string[,default]):object为实例化的对象,string为字符串,default为默认值
根据字符串string来获取对象object中的方法或属性,如果对象object中没有字符串string的属性或方法,就会返回default的值,如果不设置default的值,将会报错
获取类中方法并调用
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" class Person(object):
def __init__(self,name):
self.name = name def eat(self,food):
print('%s is eating %s'%(self.name,food)) if __name__ == '__main__':
p = Person('John')
argu = input(">>>:").strip()
if hasattr(p,argu):
getattr(p,argu)('meat')
执行结果

获取类中属性的值
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" class Person(object):
def __init__(self,name):
self.name = name def eat(self,food):
print('%s is eating %s'%(self.name,food)) if __name__ == '__main__':
p = Person('John')
argu = input(">>>:").strip()
print(getattr(p,argu))

如果字符串不是类中的属性,则返回规定的默认值
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" class Person(object):
def __init__(self,name):
self.name = name def eat(self,food):
print('%s is eating %s'%(self.name,food)) if __name__ == '__main__':
p = Person('John')
argu = input(">>>:").strip()
print(getattr(p,argu,"test"))
输入a,类中没有a这个属性,则返回规定的默认值test

setattr():
setattr(object,string,value):object为实例化的对象,string为字符串,value为值
setattr()用来设置方法或属性
把传入的字符串string设置为value名的函数,再通过getattr()来调用
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" class Person(object):
def __init__(self,name):
self.name = name def eat(self,food):
print('%s is eating %s'%(self.name,food)) #在类外定义一个函数
def talk(self):
print("%s is talking"%self.name) if __name__ == '__main__':
p = Person('John')
argu = input(">>>:").strip()
setattr(p,argu,talk) #把传入的字符串设置为talk函数
getattr(p,argu)(p) #把实例化的对象传入函数中
运行,输入a

调用的不是talk()函数,而是设置为talk()函数的字符串a
setattr()设置属性
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" class Person(object):
def __init__(self,name):
self.name = name def eat(self,food):
print('%s is eating %s'%(self.name,food)) if __name__ == '__main__':
p = Person('John')
argu = input(">>>:").strip()
setattr(p,argu,'Man') #设置属性
print(getattr(p,argu))
传入的字符串string,如果不是类中的属性,将给类创建新属性string,并赋值value给新属性

传入的字符串string,如果是类中的属性,value将覆盖原有的属性

delattr():
delattr(object,string):删除object对象中的string属性
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" class Person(object):
def __init__(self,name):
self.name = name def eat(self,food):
print('%s is eating %s'%(self.name,food)) if __name__ == '__main__':
p = Person('John')
argu = input(">>>:").strip()
delattr(p,argu)
print(getattr(p,argu))
运行,输入name

报错,Person类中没有了name属性
Python类(五)-反射的更多相关文章
- Python类总结-反射及getattr,setattr
类反射的四个基本函数 hasattr getattr setattr delattr #反射 class BlackMedium: feature = 'Ugly' def __init__(self ...
- python类的反射使用方法
曾经,博主的房东养了只金毛叫奶茶,今天就拿它当议题好了. 博主写本文时正在被广州的蚊子围攻. #反射练习 class animal(object): def __init__(self,name,fo ...
- python类的反射
反射 通过字符串映射或者修改程序运行时的状态.属性.方法, 有一下4个方法 小例子--根据用户输入调用方法: class Dog(object): def __init__(self,name): s ...
- python(7)– 类的反射
python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...
- python面试题~反射,元类,单例
1 什么是反射?以及应用场景? test.py def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): ...
- python基础-类的反射
1)反射是通过字符串方式映射内存中的对象. python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr, 改四个函数分别用于对对象内部执行:检查是 ...
- Python之路- 反射&定制自己的数据类型
一.isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 issubclass(sub, super)检查sub类是否是 super ...
- python 类的进阶
类的进阶 一 isinstance(obj,cls)和issubclass(sub,super) class Foo: def __init__(self,name): self.name = nam ...
- python基础-9__import__ 反射和面向对象基础 self 封装 继承(多继承顺序) 多态
一 反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...
随机推荐
- cuffdiff problem--Performed 0 isoform-level transcription difference tests
如何解决cuffdiff运行结果中表达量为0的情况? cuffdiff -o cdiffout -b ref.fasta -u -p 15 --library-type fr-firststrand ...
- 【P2052】道路修建(树形+搜索)
这个题看上去高大上,实际上就是一个大水题.怎么说呢,这个题思路可能比较难搞,代码实现难度几乎为0. 首先我们可以发现这是一棵树,然后问其中任意一条边左右两边的点的数量之差的绝对值,实际上,无论两边的点 ...
- spark学习1(hadoop集群搭建)
把原先搭建的集群环境给删除了,自己重新搭建了一次,将笔记整理在这里,方便自己以后查看 第一步:安装主节点spark1 第一个节点:centos虚拟机安装,全名spark1,用户名hadoop,密码12 ...
- HDFS-文件读取API
package com.zhen.hdfs; import java.io.IOException; import java.io.InputStream; import java.net.URI; ...
- http 常见的错误码
翻译自:https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html 常见错误码 一.信息 1XX (Information 1xx) ——这一类的状 ...
- java应用线上CPU过高问题排查
1.top 命令,查看占用CPU最高的PID.ps aux|grep PID 进一步确定tomcat进程出现问题.2.ps -mp pid -o THREAD,tid,time显示线程列表3.prin ...
- Codeforces Round #395 (Div. 2) C
题意 : 给出一颗树 每个点都有一个颜色 选一个点作为根节点 使它的子树各自纯色 我想到了缩点后check直径 当<=3的时候可能有解 12必定有解 3的时候需要check直径中点的组成点里是否 ...
- SQL索引工作原理
SQL 当一个新表被创建之时,系统将在磁盘中分配一段以8K为单位的连续空间,当字段的值从内存写入磁盘时,就在这一既定空间随机保存,当一个8K用完的时候, SQLS指针会自动分配一个8K的空间.这里,每 ...
- 论文笔记 — MatchNet: Unifying Feature and Metric Learning for Patch-Based Matching
论文:https://github.com/ei1994/my_reference_library/tree/master/papers 本文的贡献点如下: 1. 提出了一个新的利用深度网络架构基于p ...
- APP登录的机制
1.APP每次发送请求时,都会发送header给服务器,服务器去校验传过来的信息是否正确:校验成功后登录成功,若传入的信息不符合该用户的信息则服务器判断,传给APP登录失败 每次的请求都会传入上图中的 ...