反射

反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!

hasattr

判断对象中是否有这个方法或变量

class Person(object):
def __init__(self,name):
self.name = name
def walk(self):
print('{} is walking'.format(self.name)) li = Person('libai')
print(hasattr(li,'name'))#True。因为存在name变量
print(hasattr(li,'walk'))#True。因为存在walk方法
print(hasattr(li,'age'))#False。因为不存在age方法或变量

getattr

获取对象中的方法或变量的内存地址

class Person(object):
def __init__(self,name):
self.name = name
def walk(self):
print('{} is walking'.format(self.name)) li = Person('libai') n = getattr(li,'name')#获取name变量的内存地址
print(n) f = getattr(li,'walk')#获取walk方法的内存地址
f() #调用walk方法 #我们发现getattr有三个参数,那么第三个参数是做什么的呢?
s = getattr(li,'age','not found')
print(s) # 打印结果:not find。因为age在对象s中找不到,本应该报错,属性找不到,但因为修改了找不到就输出not find

hasattr、getattr练习

# 通过反射
# 对象名 获取对象属性 和 普通方法
# 类名 获取静态属性 和类方法 和 静态方法

参考源码:hasattr_getattr.py

setattr

为对象添加变量或方法

def func(self):
print('{} is walking'.format(self.name)) class Person(object):
def __init__(self,name):
self.name = name li = Person('libai')
setattr(li,'walk',func)#将func函数添加到对象li中,并命名为walk
li.walk(li) #调用walk方法,因为这是额外添加的方法,需要手动传入对象 setattr(li,'age',28) #添加一个变量age
print(li.age) #打印结果

delattr

删除对象中的变量。注意:不能用于删除方法

class Person(object):
def __init__(self,name):
self.name = name
def walk(self):
print('{} is walking'.format(self.name)) li = Person('libai') delattr(li,'name') #删除name 变量
print(li.name) #引发异常

反射当前模块成员

name = 'kk'
import sys
# print(sys.modules)
# print(getattr(sys.modules['__main__'],'name'))
print(getattr(sys.modules[__name__],'name'))#获取当前模块的属性
import time
t = input('>>>') #不带参数,测试输入:asctime
# ti = getattr(time,t)
# print(ti()) #带参数的处理,测试输入:strftime
ti = getattr(time,t)('%Y-%m-%d %H:%M:%S')
print(ti)

python学习日记(OOP——反射)的更多相关文章

  1. python学习日记(OOP——类的内置方法)

    __str__和__repr__ 改变对象的字符串显示__str__,__repr__ 我们先定义一个Student类,打印一个实例: class Student(object): def __ini ...

  2. Python 学习日记(第三周)

    知识回顾 在上一周的学习里,我学习了一些学习Python的基础知识下面先简短的回顾一些: 1Python的版本和和安装 Python的版本主要有2.x和3.x两个版本这两个版本在语法等方面有一定的区别 ...

  3. Python学习日记 --day2

    Python学习日记 --day2 1.格式化输出:% s d  (%为占位符 s为字符串类型 d为数字类型) name = input('请输入姓名') age = int(input('请输入年龄 ...

  4. python学习日记(基础数据类型及其方法01)

    数字 int 主要是用于计算的,常用的方法有一种 #既十进制数值用二进制表示时,最少使用的位数i = 3#3的ASCII为:0000 0011,即两位 s = i.bit_length() print ...

  5. Python学习日记(一):拜见小主——Python

    近日学习Python,特将学习过程及一点心得记录于此. 由于之前做过一个Java爬虫的项目,虽然很长时间没有碰过爬虫,但是小郭同学有一颗不死的爬虫心,哈哈.最近在互联网上找一些电影的时候,有很多电影只 ...

  6. Python学习日记(二十七) 反射和几个内置函数

    isinstance() 判断isinstance(obj,cls)中obj是否是cls类的对象 class Person: def __init__(self,name): self.name = ...

  7. python学习日记(OOP数据封装)

    class Student(object): def __init__(self,name,score): self.name = name self.score = score li = Stude ...

  8. python学习日记(OOP——静态方法和类方法)

    classmethod 类方法在Python中使用比较少,类方法传入的第一个参数为cls,是类本身.并且,类方法可以通过类直接调用,或通过实例直接调用.但无论哪种调用方式,最左侧传入的参数一定是类本身 ...

  9. python学习日记(OOP——@property)

    在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑.为了限制score的 ...

随机推荐

  1. 从.Net到Java学习第六篇——SpringBoot+mongodb&Thymeleaf&模型验证

    SpringBoot系列目录 SpringBoot整合mongodb MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.如果你没用过Mong ...

  2. Mac 终端 显示隐藏文件

    defaults write com.apple.finder AppleShowAllFiles Yes && killall Finder //显示隐藏文件 defaults wr ...

  3. MySQL 常用指令小结

    l  创建数据库:CREATE DATABASE table_name; l  删除数据库:DROP DATABASE table_name; l  展示数据库:SHOW DATABASE; l  选 ...

  4. python 图片在线转字符画预览

    文章链接:https://mp.weixin.qq.com/s/yiFOmljhyalE8ssAgwo6Jw 关于python图片转字符画,相信大家都不陌生,经常出现在 n个超有趣的python项目中 ...

  5. ServiceHub.DataWarehouseHost.exe内存泄漏问题的处理

    Visual Studio 2017的15.2版本在debug应用程序时,ServiceHub.DataWarehouseHost.exe会出现严重的内存泄漏的问题,一个小时左右,内存耗了将近8GB. ...

  6. SQL Server非域(跨域)环境下镜像(Mirror)的搭建步骤及注意事项

    在实际的生产环境下,我们经常需要跨域进行数据备份,而创建Mirror是其中一个方案.但跨域创建Mirror要相对复杂的多,需要借助证书进行搭建. 下面我们将具体的步骤总结如下: 第一部分 创建证书 S ...

  7. LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  8. java源码equals和hashCode

    equals public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject ...

  9. Redis学习笔记(2)——Redis的下载安装部署

    一.下载Redis Redis的官网下载页上有各种各样的版本,如图 但是官网下载的Redis项目不正式支持Windows.如果需要再windows系统上部署,要去GitHub上下载.我下载的是Redi ...

  10. ORACLESQL语句的优化

    ORACLESQL语句的优化: 选择最有效率的表名顺序:应该选择记录条数最少的表作为基表! 因为Oracle解析器的处理顺序是从右至左的.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们. ...