乔克视界 乔克视界
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档

乔克

云原生爱好者
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档
  • Docker

  • Golang

  • AIOps

  • Python

    • 基础知识

      • Python之链表
      • Python 之类的初识
      • Python之函数式编程
      • Python之匿名函数
      • Python之自定义函数
      • Python之异常处理
      • Python之条件与循环
      • Python之列表生成式
      • Python之生成器
      • Python之装饰器
      • Python之迭代器
      • Python之进程、线程、协程
      • Python之深浅拷贝
      • Python之反射
        • 反射的内置函数
          • getattr
          • hasattr
          • setattr
          • delattr
      • Python之并发编程
      • Python之垃圾回收机制
      • Python之断言assert
      • Python之上下文管理器和with语句
      • Python中JSON的对应关系
      • Python之单例模式
    • Django框架

    • 其他

  • DevOps

  • 专栏
  • Python
  • 基础知识
乔克
2025-07-19
目录

Python之反射

反射就是通过字符串的形式导入模块。通过字符串的形式,去模块中寻找函数去执行;利用字符串的形式去对象中操作成员,一切都是基于字符串的事件驱动。

# 反射的内置函数

# getattr

class A(object):
    def __init__(self, name):
        self.name = name

    def method(self):
        print("Your name is {}".format(self.name))

obj = A("joker")

## 如果obj里有name属性就打印self.name,反之打印not find
print(getattr(obj, "name", "not find"))

## 如果obj里有age属性就打印self.age,反之打印not find
print(getattr(obj, "age", "not find"))

## 如果是方法,就打印其地址,反之打印default
print(getattr(obj, "method", "default"))

## 如果是方法,就打印其地址,反之打印default
print(getattr(obj, "func", "default"))


----------------------------------------------------------------------
joker
not find
<bound method A.method of <__main__.A object at 0x0000018992FD20B8>>
default
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# hasattr

hasattr()返回的是布尔值,判断对象、模块等中是否存在这个值;

print(hasattr(obj, "name"))
print(hasattr(obj, "age"))
print(hasattr(obj, "method"))
print(hasattr(obj, "func"))

---------------------------------------------------
True
False
True
False
1
2
3
4
5
6
7
8
9
10

# setattr

参数是一个对象,一个字符串和一个任意值。字符串可能会列出一个现有的属性或一个新的属性。这个函数将值赋给属性的。该对象允许它提供.

## 如果对象中有name属性,则把"blala"赋值给它
print(setattr(obj, "name", "blala"))
print(getattr(obj, "name"))
----------------------------------------------
None			<---- set成功会返回None
blala

## 如果对象中没有age属性,则创建一个新属性age,将12赋值给它
print(setattr(obj, "age", 12))
print(getattr(obj, "age"))
-----------------------------------------------
None
12

## 如果对象中有method方法,则重写里面的方法
print(setattr(obj, "method", print("OK")))
print(getattr(obj, "method"))
-----------------------------------------------
None
OK

## 如果对象中没有func方法,则创建一个新的方法func
print(setattr(obj, "func", print("func is OK")))
print(getattr(obj, "func"))
----------------------------------------------
None
func is OK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# delattr

删除模块或者对象中的属性或方法。删除成功会返回 None。

print(delattr(obj, "name"))
print(hasattr(obj, "name"))
--------------------------------------
None
False

## 如果不存在,就报异常
print(delattr(obj, "age"))
-------------------------------------
AttributeError: age

## 创建一个新的func
print(setattr(obj, "func", print("func is OK")))
print(delattr(obj, "func"))
print(hasattr(obj, "func"))
--------------------------------------
None			<------ 添加成功返回码
func is OK
None			<------ 删除成功返回码
False

## 对象中原有定义的函数是无法del的,会报异常
print(hasattr(obj, "method"))
print(delattr(obj, "method"))
--------------------------------------
True
AttributeError: method
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

作者:乔克

本文链接:https://jokerbai.com

版权声明:本博客所有文章除特别声明外,均采用 署名-非商业性-相同方式共享 4.0 国际 (CC-BY-NC-SA-4.0) 许可协议。转载请注明出处!

上次更新: 2025/07/19, 11:33:23
Python之深浅拷贝
Python之并发编程

← Python之深浅拷贝 Python之并发编程→

最近更新
01
使用 Generic Webhook Trigger 触发 Jenkins 多分支流水线自动化构建
07-19
02
使用Zadig从0到1实现持续交付平台
07-19
03
基于Jira的运维发布平台
07-19
更多文章>
Theme by Vdoing | Copyright © 2019-2025 乔克 | MIT License | 渝ICP备20002153号 |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式