反射

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

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俱乐部群里谈郑智话题,谢谢!

    收到私聊说代码无国界,但是程序员是有国界的,程序员也有关心国家大事的权力!   我是极度赞同“代码无国界,但是程序员是有国界的,”我也极度赞同程序员也要爱国. 因为我们新兴县六祖镇叶氏家族就有四位爱国 ...

  2. iOS----------使用cocoapods遇到的问题

    -bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad ...

  3. 设置Editext的光标宽高与颜色

    在Editext的布局属性上加上 android:textCursorDrawable="@drawable/cursor_shape" cursor_shape如下: <? ...

  4. SQLServer之创建隐式事务

    隐式事务创建注意事项 IMPLICIT_TRANSACTIONS为 ON 时,系统处于“隐式”事务模式. 这意味着如果 @@TRANCOUNT = 0,下列任一 Transact-SQL 语句都会开始 ...

  5. python正则表达式模块re

    正则表达式的特殊元素 匹配符号 描述 '.'(点dot) 在默认模式下,它匹配除换行符之外的任何字符.如果指定了DOTALL标志,则匹配包括换行符在内的任何字符 '^'(Caret) 匹配以字符串开头 ...

  6. UGUI合批原理笔记

    可以通过Frame debugger查看每个drawcall绘制了哪些东西 UGUI源码下载地址:https://bitbucket.org/Unity-Technologies/ui/downloa ...

  7. python3 set(集合)

    add(增加元素) name = set(['Tom','Lucy','Ben']) name.add('Juny') print(name) #输出:{'Lucy', 'Juny', 'Ben', ...

  8. 小程序的js处理步骤

    <!-- 包含请求路由 --> var hostUrl = require('../../config.js').hostUrl; Page({ <!-- 页面的初始数据 --> ...

  9. windows10 1903 64位系统

    近日,微软完成并开始推送Windows 10 2019年的第一个重大升级的预览版本,版本号是v1903,命名则是2019年5月更新版. 点击下载windows10

  10. 自定义JDBC链接池

    上篇简单介绍了jdbc链接数据库: 本篇就说一下自定义连接池以及增删改查的测试: 自定义连接池 自定义链接池的原因 JDBC连接中用到Connection   在每次对数据进行增删查改 都要 开启  ...