反射即通过字符串映射或修改程序运行时的状态、属性、方法

有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类(五)-反射的更多相关文章

  1. Python类总结-反射及getattr,setattr

    类反射的四个基本函数 hasattr getattr setattr delattr #反射 class BlackMedium: feature = 'Ugly' def __init__(self ...

  2. python类的反射使用方法

    曾经,博主的房东养了只金毛叫奶茶,今天就拿它当议题好了. 博主写本文时正在被广州的蚊子围攻. #反射练习 class animal(object): def __init__(self,name,fo ...

  3. python类的反射

    反射 通过字符串映射或者修改程序运行时的状态.属性.方法, 有一下4个方法 小例子--根据用户输入调用方法: class Dog(object): def __init__(self,name): s ...

  4. python(7)– 类的反射

    python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...

  5. python面试题~反射,元类,单例

    1 什么是反射?以及应用场景? test.py def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): ...

  6. python基础-类的反射

    1)反射是通过字符串方式映射内存中的对象. python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr, 改四个函数分别用于对对象内部执行:检查是 ...

  7. Python之路- 反射&定制自己的数据类型

    一.isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 issubclass(sub, super)检查sub类是否是 super ...

  8. python 类的进阶

    类的进阶 一 isinstance(obj,cls)和issubclass(sub,super) class Foo: def __init__(self,name): self.name = nam ...

  9. python基础-9__import__ 反射和面向对象基础 self 封装 继承(多继承顺序) 多态

    一 反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...

随机推荐

  1. hdu 1695 GCD 莫比乌斯

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  2. CSS3中的变形功能

    一.变形主要值得是利用transform功能来实现文字或图片的旋转,缩放,倾斜,移动这四种处理. 1.旋转-----transform:rotate(xxdeg);( IE9以上,safari 3.1 ...

  3. 解析PHP中intval()等int转换时的意外异常情况

    <?php$a = 9.45*100;var_dump($a);var_dump(intval($a));$a = 945*1.00;var_dump($a);var_dump(intval($ ...

  4. spring: 使用嵌入式数据源 EmbeddedDatabaseBuilder

    嵌入式数据源作为应用的一部分运行,非常适合在开发和测试环境中使用,但是不适合用于生产环境.因为在使用嵌入式数据源的情况下,你可以在每次应用启动或者每次运行单元测试之前初始化测试数据. 使用Spring ...

  5. Windows 运行中的命令

    辅助功能选项 access.cpl 添加硬件向导 hdwwiz.cpl 添加或删除程序 appwiz.cpl 管理工具 control admintools 自动更新 wuaucpl.cpl Blue ...

  6. zoj 3965 Binary Tree Restoring(搜索)

    Binary Tree Restoring Time Limit: 1 Second      Memory Limit: 65536 KB      Special Judge Given two ...

  7. RK30SDK开发板驱动分析(二):DDR频率配置

    在内核配置界界面,我们可以很容易的配置DDR的频率,300M OR 600M, so easy! 那么它是如何起作用的呢? 回想 RK30SDK开发板驱动分析(一) 末尾提到MACHINE_START ...

  8. linux服务器版svn安装

    1.检查svn是否安装:rpm -aq subversion2.安装命令yum -y install subversion3.建立svn版本库数据存储根目录mkdir -p /application/ ...

  9. 《精通.NET企业项目开发》 - 书摘精要

    (P7) 处于任何逻辑层面上的类,对于同一层面上的其他类应该是可重用的:对于在同等范围内其他所有需要该数据的类而言,提供数据的类应该是可以被调用的: (P9) 大多数企业系统都是用平台无关的技术构建的 ...

  10. 利用HTML5开发Android笔记(上篇)

    资源来自于www.mhtml5.com 杨丰盛老师成都场的PPT分享 一个很简明的demo 可以作为入门基础 学习的过程中做了点笔记 整理如下 虽然内容比较简单 但是数量还是比较多的 所以分了3篇 ( ...