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,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...
随机推荐
- 分布式服务管理zookeeper的java api
zookeeper是一个分布式服务管理工具,本身具备高可用性,很多知名分布式系统入hadoop.Hbase等都采用zk管理. 常见的两个应用场景:1.服务的注册与发现 2.集群统一配置 下面看一下使用 ...
- YARN作业提交流程剖析
YARN(MapReduce2) Yet Another Resource Negotiator / YARN Application Resource Negotiator对于节点数超出4000的大 ...
- table-layout 属性
最近被测试提了一个bug,表单的某个字段有1300的字数限制,测试填了1300字,提交后,表格上的呈现丑爆了,那个字段的所在的列撑满了整个表格,其他列被压缩的很小. 后来知道了table-layout ...
- QT 多页面切换之QTabWidget
//mydialog.h #ifndef MYDIALOG_H #define MYDIALOG_H #include <QDialog> class QTabWidget; class ...
- Spring data jpa 实现简单动态查询的通用Specification方法
本篇前提: SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法 这篇文章中的第二种方法 实现Specification 这块的方法 只适用于一个对象针对某一个固定字 ...
- dataframe to sql
使用pandas的to_sql时,还涉及到一些sql数据库的操作 在网上找到一段代码,很方便使用.来源:blog.csdn.net/qcyfred/article/details/78085243?l ...
- python基础5 - 产生随机数
随机数 在 Python 中,要使用随机数,首先需要导入 随机数 的 模块 —— “工具包” import random 导入模块后,可以直接在 模块名称 后面敲一个 . 然后按 Tab 键,会提示该 ...
- dp3--codevs2598 编辑距离问题
dp3--codevs2598 编辑距离问题 一.心得 1.字符串相关问题dp的时候从0开始是个陷阱 二.题目 2598 编辑距离问题 时间限制: 1 s 空间限制: 128000 KB 题目等 ...
- JS中的“use strict” 严格模式
1.介绍严格模式 2.严格模式影响范围 变量: var.delete.变量关键字 对象: 只读属性. 对象字面量属性重复申明 函数:参数重名.arguments对象.申明 其他:this.eval. ...
- Multiprovide 实践理解
“多重提供器”是一种“信息提供者”,它综合了多个“信息提供者”的数据以用于报告.“多重提供者”本身不包含任何数据.“多重提供者”的数据由所基于的“信息提供者”专门提供,这些“信息提供者”组合在一起进行 ...