Python学习笔记之Python对象反射、类反射、模块反射

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 "666"

然后在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

参考

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python小屋

列表元素循环移位中Python切片的妙用

之前有个文章中介绍了列表循环移位的3中方法,原文请见:Python序列循环移位的3种方法 其中第二种方法虽然更直接地翻译了题目的要求,但是显得还是有点啰嗦,如...

35340
来自专栏前端侠2.0

ng6的ng-template的一个用法 原

但第一种方法无法插入name的值。  参数是context,不明白它的context是要传递什么进去

66530
来自专栏从零开始学自动化测试

Selenium2+python自动化37-爬页面源码(page_source)

前言 有时候通过元素的属性的查找页面上的某个元素,可能不太好找,这时候可以从源码中爬出想要的信息。selenium的page_source方法可以获取到页面源码...

37270
来自专栏c#开发者

[原创]PipelineTools 文件传输工具

功能模块只有 1/文件目录-〉文件目录 2/文件目录-〉MSMQ 3/MSMQ-〉MSMQ 4/MSMQ -〉文件目录 在传输MSMQ是文件不能超过4M 下载文...

38970
来自专栏运维技术迷

Redis全局命令

redis有5种数据结构,他们是键值对中的值,对于键来说有一些通用的命令。 查看所有键 语法:keys * [root@vultr ~]# redis-cli ...

35170
来自专栏我是攻城师

关于线程可见性一个“诡异”的问题

如果执行上面的代码,大多人可能觉得会死循环,因为这里没有任何的同步策略,比如synchronized,Lock,atomic,volatile等关键字,也就是说...

10330
来自专栏Python攻城狮

Python-线程1.线程2.多线程-threading3.主线程会等待所有的子线程结束后才结束4.查看线程数量 5.threading注意点 6.多线程-共享全局变量 7.列表当做实参传递到线程中

thread.start_new_thread(function,args[,kwargs])

48630
来自专栏Python小屋

Python快速计算Fibonacci数列中第n项的方法

from time import time from functools import lru_cache def fibo1(n): '''递归法''' ...

33970
来自专栏mathor

线程的基本概念

14540
来自专栏瓜大三哥

HLS Lesson16-数组优化:数组分割

数组可以通过resource这个directive精确指定当前使用的memory。比如是分布式RAM还是Block RAM,采用单端口或者双端口。提高数据的吞吐...

286100

扫码关注云+社区

领取腾讯云代金券