当前位置: 首页 > news >正文

python 反射

反射

反射:其实就是用字符串类型的名字去操作变量

这在一些只能拿到字符串类型名字的情况下就极为好用了

反射对象的属性      (用到的关键字:getattr)

class A:     #先创建一个类
    price = 25
    def func(self):    #定义一个方法
        print('卖橘子啦')
a = A()             #实例化一个对象
a.name = 'sakura'  #给对象添加一个属性 名字=樱花
print(getattr(a,'name'))  #getattr(对象,'属性名')  这个属性名一定是字符串形式

sakura  

反射对象的方法

class A:     #先创建一个类
    price = 25
    def func(self):    #定义一个方法
        print('卖橘子啦')
a = A()             #实例化一个对象
a.name = 'sakura'  #给对象添加一个属性 名字=樱花
getattr(a,'func')()  #getattr(对象,'方法名')

卖橘子啦

反射类的属性

class A:     #先创建一个类
    price = 25
    def func(self):    #定义一个方法
        print('卖橘子啦')
a = A()             #实例化一个对象
a.name = 'sakura'  #给对象添加一个属性 名字=樱花
print(getattr(A,'price'))  # getattr(类,'属性名')

25

反射类的方法

class A:     #先创建一个类
    price = 25
    def func(self):    #定义一个方法
        print('卖橘子啦')
a = A()             #实例化一个对象
a.name = 'sakura'  #给对象添加一个属性 名字=樱花
ret = getattr(A,'func') #getattr(类,'方法名')   这样得到的是一个方法的内存地址记得调用
ret(a)                #调用一个方法一定要给它传个参数
getattr(A,'func')(a) #这个是上面那个的简写形式

卖橘子啦
卖橘子啦

如果调用类中没有的属性或方法,程序报错怎么办

这时候就要用到一个和getattr配套使用的 hasattr

class A:     #先创建一个类
    price = 25
    def func(self):    #定义一个方法
        print('卖橘子啦')
a = A()             #实例化一个对象
a.name = 'sakura'  #给对象添加一个属性 名字=樱花
if hasattr(A,'funs'): # 作用就是判断类中有没有这个方法 如果有就执行下一步
    getattr(A,'funs')(a) #这个是上面那个的简写形式

可以看见 程序并没有报错 也就是没有执行funs方法

除此之外,还能反射模块中的方法和属性

反射自己模块中的变量和函数

def funs():  #写一个简单的函数
    print('你站在这里不要走动,我去给你把橘子树搬来')

现在 有了一个函数,那该怎么调用它呢

import sys        #使用sys模块
def funs():  #写一个简单的函数
    print('你站在这里不要走动,我去给你把橘子树搬来')
year = 8102
print(sys.modules['__main__'])   #这样就能调用自己的模块了 (在内存中自己写的没有使用的模块都叫__main__)
# 现在知道自己写的函数就是sys.modules['__main__']
print(getattr(sys.modules['__main__'],'year'))

打印出来第一个是:一个函数的内存地址

第二个是:8102

import sys        #使用sys模块
def funs():  #写一个简单的函数
    print('你站在这里不要走动,我去给你把橘子树搬来')
year = 8102
getattr(sys.modules['__main__'],'funs')()  #这样就可以调用这个函数了
getattr(sys.modules[__name__],'funs')()     # 有些情况下 函数名字也会改变之类的, 所以把它设成变量更好

你站在这里不要走动,我去给你把橘子树搬来
你站在这里不要走动,我去给你把橘子树搬来

设置修改变量

class Circle: #创建一个类
    pass
a = Circle()   #实例化一个对象
a.name = 'sakura'  #给这个对象一个属性 名字=樱花
print(a.name)
setattr(a,'name','dark')  #用setattr修改name的值
print(a.name)

sakura
dark

可以看见name的值被修改了

删除一个变量

class Circle:
    print('这个是橘子树')
a = Circle()

这个是橘子树

现在有一个类和一个对象

class Circle:
    print('这个是橘子树')
a = Circle()
delattr(Circle,'a') #delattr(类或对象,'属性名')

这样就把类中的a对象删除了

转载于:https://www.cnblogs.com/GrandDarkness/p/8329884.html

相关文章:

  • 01. Consul 入门
  • 程序员行话(黑话)汇总
  • ZJOI2006 书架
  • sdfasdf
  • 设计模式六大原则
  • 10.15 iptables filter表案例 10.16/10.17/10.18 iptable
  • 前端工程化(Gulp、Webpack)-webpack
  • Squirrel GUI+ Phoenix 连接Hbase
  • 集群介绍,keepalived介绍,用keepalived配置高可用集群
  • 011-Spring Boot 运行流程分析SpringApplication.run
  • Linux Centos 7 - 系统安装
  • 宝哥iOS网络篇-AFNetworking基础使用指南
  • JS数组方法汇总
  • [解决方案]sql server复制需要有实际的服务器名称才能连接到服务器
  • 远程管理防火墙一
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【EOS】Cleos基础
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Laravel 菜鸟晋级之路
  • log4j2输出到kafka
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Shadow DOM 内部构造及如何构建独立组件
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 实现简单的正则表达式引擎
  • 使用权重正则化较少模型过拟合
  • 学习JavaScript数据结构与算法 — 树
  • 硬币翻转问题,区间操作
  • 移动端高清、多屏适配方案
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (poj1.3.2)1791(构造法模拟)
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)详解PHP处理密码的几种方式
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .Net接口调试与案例
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @Transactional 竟也能解决分布式事务?
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [C# 网络编程系列]专题六:UDP编程
  • [CareerCup][Google Interview] 实现一个具有get_min的Queue
  • [EFI]英特尔 冥王峡谷 NUC8i7HVK 电脑 Hackintosh 黑苹果efi引导文件
  • [JS] 常用正则表达式集(一)
  • [LeetCode]-Pascal's Triangle III 杨辉三角问题
  • [Linux基础开发工具---vim]关于vim的介绍、vim如何配置及vim的基本操作方法
  • [nginx] 网上最全面nginx教程(近100篇文章整理)
  • [NOSQL] Redis介绍
  • [py]python自省工具