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,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...
随机推荐
- Centos7 远程登录端口22 设置
第一步 #查看本机是否安装SSH软件包 [root@localhost ~]# rpm -qa | grep ssh openssh-server-6.6.1p1-12.el7_1.x86_64 op ...
- poj 2115 C Looooops 扩展欧几里德
C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23616 Accepted: 6517 Descr ...
- libvirt cpu mode
libvirt中 cpu mode可以有以下3种: custom : 该模式下cpu element用来描述guest可见的CPU,该模式也是mode的default模式,它会使得persistent ...
- jstl: <c:url> 标签
这个标签主要是用来重写 URL 地址.它的使用格式如下所示:<c:url value=”value” [context=”context”] [var=”varName”] [scope=”pa ...
- DSD, DFF, DSF, DST概念解析
DSD = Direct Stream Digital; DST = D DSD是技术原理. DSDIFF简称DFF 是文件后缀名 DSF也是文件后缀名,他们是一个意思,只是一个是飞利浦的叫法 一个 ...
- poj-1426-Find The Multiple(打表水过)
思路: 2的最近可以整除的数是10 所以,很关键的一点,只要是偶数,例如: 6:2*3,可以拆分为能够被2整除和能够被3整除的乘积,所以,10*111=1110 144:72*2,8*9*2,2*2* ...
- MFC获得当前应用程序目录的GetCurrentDirectory()和GetModuleFileName()函数
在 开发过程中经常需要获得程序当前的运行目录,这时就可以使用GetCurrentDirectory()和GetModuleFileName()函 数,GetCurrentDirectory只是返回当前 ...
- eclipse 环境 JUnit 测试框架(junit.framework.* 与 org.junit.*)
如下所示,先通过 build path 导入 junit 环境依赖的 jar 包: 1. junit.framework.* junit.framework.* 主要类和函数: Test TestCa ...
- unix的输入输出操作
unix的输入输出操作 使用的头文件 #include <unistd.h> #include <stdio.h> 函数说明 ssize_t read(int fd, void ...
- Scala 面向接口编程
1.如果要实现一个接口,前边没有extends关键字就可以使用extends,如果有要使用with关键字 2.Scala 中的接口支持多种继承,类或者抽象类不支持多种继承 3.抽象属性:未被实例化的属 ...