python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

一、getattr

对象获取

class Manager:
role = "管理员"
def __init__(self,name,sex,phone,mail):
self.name = name
self.sex = sex
self.phone = phone
self.mail = mail def createClass(self):
print("create class") def createTeacher(self):
print("createTeacher") def createStu():
print("createStu") manager = Manager("safly","男",123456,123456) print("---对象获取对象方法-----")
f = getattr(manager,"createClass")
f() print("---对象获取对象属性-----")
name = getattr(manager,"name")
print(name) print("---对象获取类属性-----")
role = getattr(manager,"role")
print(role) print("---对象获取类属性(可以设置默认值)-----")
import logging
if hasattr(manager,"role1"):
role = getattr(manager,"role1","roleDefault")
print(role)
else:
logging.warn("没有role属性")
role = getattr(manager, "role1", "roleDefault")
print(role)

类获取

class Manager:
role = "管理员"
def createClass(self):
print("create class") def createStu():
print("createStu") m = Manager() f = getattr(Manager,"createClass")
f(Manager) f = getattr(Manager,"createClass")
f(m) role = getattr(Manager,"createStu")
role() #对象获取类属性
role = getattr(Manager,"role")
print(role)

输出如下:

create class
create class
createStu
管理员

二、setattr

设置类属性、方法

class Manager:
role = "管理员"
def __init__(self,name,sex,phone,mail):
self.name = name
self.sex = sex
self.phone = phone
self.mail = mail def createClass(self):
print("create class") def createTeacher(self):
print("createTeacher") def createStu():
print("createStu") manager = Manager("safly","男",123456,123456) print("----设置类属性------")
setattr(Manager,"country","china")
print(Manager.country) print("----删除类属性------")
delattr(Manager,"country")
# #删除报错
# print(Manager.country)
print("----设置类方法------")
def Method(parm):
print("我是被绑定的class之外的方法parm--",parm) setattr(Manager,"Method",Method)
Manager.Method("saf")
Manager.Method(Manager)
Manager.Method(manager) def Method():
print("我是被绑定的class之外的方法parm--")
setattr(Manager,"Method",Method)
Manager.Method()

输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/demo.py
----设置类属性------
china
----删除类属性------
----设置类方法------
我是被绑定的class之外的方法parm-- saf
我是被绑定的class之外的方法parm-- <class '__main__.Manager'>
我是被绑定的class之外的方法parm-- <__main__.Manager object at 0x0343B4B0>
我是被绑定的class之外的方法parm-- Process finished with exit code 0

设置对象属性、方法

class Manager:
role = "管理员"
def __init__(self,name,sex,phone,mail):
self.name = name
self.sex = sex
self.phone = phone
self.mail = mail def createClass(self):
print("create class") def createTeacher(self):
print("createTeacher") def createStu():
print("createStu") manager = Manager("safly","男",123456,123456) print("----设置对象属性------")
setattr(manager,"age",20)
print(manager.age) print("----删除对象属性------")
delattr(manager,"age")
# 'Manager' object has no attribute 'age'
# print(manager.age) print("---对象不能删除类属性---")
setattr(Manager,"country","china")
print(Manager.country)
# delattr(manager,"country")
# print(Manager.country) print("----设置对象方法------")
def create_course(self):
print('创建了一个课程') setattr(manager,'create_course',create_course)
manager.create_course(manager) def create_grade():
print('创建了一个班级')
setattr(manager,'create_grade',create_grade)
manager.create_grade()

输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/demo.py
----设置对象属性------
20
----删除对象属性------
---对象不能删除类属性---
china
----设置对象方法------
创建了一个课程
创建了一个班级 Process finished with exit code 0

三、模块反射

创建一个模块mokuai.py

a = 1
def method(rag):
print(rag)
return ""

然后在python.py中导入以上模块

import mokuai
print(getattr(mokuai,"a"))
method = getattr(mokuai,"method")
ret = method(8888)
print(ret)

输出如下:

1
8888
666

四、反射本模块函数、变量

aa = 11
def method():
print("---method---")
import sys print(sys.modules[__name__])
print(getattr(sys.modules[__name__],"aa"))
f = getattr(sys.modules[__name__],"method")
f()

输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/demo.py
<module '__main__' from 'E:/python/py_pro/demo.py'>
11
---method--- Process finished with exit code 0

参考

Python面试题之Python对象反射、类反射、模块反射的更多相关文章

  1. 千万不要错过这几道Python面试题,Python面试题No16

    第1题: python下多线程的限制以及多进程中传递参数的方式? python多线程有个全局解释器锁(global interpreter lock),简称GIL,这个GIL并不是python的特性, ...

  2. Python面试题之Python中的类和实例

    0x00 前言 类,在学习面向对象我们可以把类当成一种规范,这个思想就我个人的体会,感觉很重要,除了封装的功能外,类作为一种规范,我们自己可以定制的规范,从这个角度来看,在以后我们学习设计模式的时候, ...

  3. Python面试题之Python反射机制

    0x00 前言 def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): print('f4') a = ...

  4. Python面试题之Python面试题汇总

    在这篇文章中: Python基础篇 1:为什么学习Python 2:通过什么途径学习Python 3:谈谈对Python和其他语言的区别 Python的优势: 4:简述解释型和编译型编程语言 5:Py ...

  5. python面试题二:Python 基础题

    1.位和字节的关系? Byte 字节 bit 位 1Byte = 8bit 2.b.B.KB.MB.GB 的关系? 1Byte = 8bit KB 1KB=1024B MB 1MB=1024KB GB ...

  6. Python面试题之Python面向对象编程汇总

    面向对象的设计思想是从自然界中来的,因为在自然界中,类(Class)和实例(Instance)的概念是很自然的.Class是一种抽象概念,比如我们定义的Class——Student,是指学生这个概念, ...

  7. python面试题之Python支持什么数据类型?

    所属网站分类: 面试经典 > python 作者:外星人入侵 链接:http://www.pythonheidong.com/blog/article/67/ 来源:python黑洞网,专注py ...

  8. Python面试题之Python反射详解

    0x00 前言 反射,可以理解为利用字符串的形式去对象中操作成员属性和方法 反射的这点特性让我联想到了exec函数,也是把利用字符串的形式去让Python解释器去执行命令 Python Version ...

  9. Learn Python the hard way, ex45 对象、类、以及从属关系

    #!/usr/bin/python #coding:utf-8 # animal is-a object(yes,sort of sonfusing)look at the extra credit ...

随机推荐

  1. linux程序设计——主机字节序和网络字节序(第十五章)

    15.2.10    主机字节序和网络字节序 当在基于intel处理器的linux机器上执行新版本号的server和客户程序时,能够用netstat命令查看网络连接状况.它显示了客户/server连接 ...

  2. hdu 2117:Just a Numble(水题,模拟除法运算)

    Just a Numble Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  3. 【ask】ghost分区还原win7出现蓝屏,试图加载CLASSPNP驱动时出现

    1.最近由于需要把整个c盘备份了,然后还原在另一台机器上. 2.结果当然时出事了,开始一切如旧,但是机器重启后,蓝屏了. 3.哦,开始立马觉得可能时因为有些软件的驱动是装载d盘了. 4.赶紧把d盘也备 ...

  4. 转载 web前端简历

    Web前端程序员简历模板 本简历模板由国内首家互联网人才拍卖网站「 JobDeer.com 」提供. (括号里的是我们的顾问编写的说明,建议在简历书写完成后统一删除) 先讲讲怎样才是一份好的技术简历 ...

  5. DB水平切换要点

    分区健选择 数据应该怎样拆分,依照什么纬度来拆分 节点路由 应用程序写死/客户端(TDDL,cobar-client)/中间层(cobar-server) 固定分配/动态分配/混合 分片数据均衡 某些 ...

  6. logback配置每天生成一个日志文件,保存30天的日志文件

    <?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 文件输出格 ...

  7. CentOS7.0 安装 Nginx

    记录下,方便以后查阅. 1.安装依赖库 yum install gcc-c++ yum install pcre pcre-devel yum install zlib zlib-devel yum ...

  8. poj3683(2-SAT 求任意方案)

    基础的2-SAT求任意方案的题目. Priest John's Busiest Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissi ...

  9. java反射——方法

    大家都知道反射技术在Java里面时非常重要的一个技术点,因为Java好多框架的编写都是基于反射的,别的不多说,spring框架里面的IOC就是基于反射实现.那么什么是反射呢?JAVA反射机制是在运行状 ...

  10. 14.wamp自定义网站根目录

    1.首先打开Apache 中的配置文件httpd.conf crtl+f 搜索  documentroot  ,在找到的目录中将目录修改自己的网站的目录,注意\ 与/ 2.在向下移动,找到<Di ...