首页 > 其他分享 >Reflect反射

Reflect反射

时间:2024-03-19 20:15:01浏览次数:13  
标签:反射 obj self class Reflect print Children def

Reflect反射

通过字符串操作类对象 或者 模块中的相关成员的操作

hasattr

# 检测对象/类是否有指定的成员
# return bool


class Father():
	pass

class Mother():
	pass
	
class Children(Father,Mother):
	eye = "蓝色的"
	weight = "1吨"
	
	def eat(self):
		print("小孩下生会喝奶")
	
	def drink(self):
		print("小孩下生喜欢喝勇闯天涯...")
		
	def __la(self):
		print("小孩自动啦,无法控制")
	
obj = Children()
	
# (1)hasattr() 检测]对象/类是否有指定的成员
# 对象

res = hasattr(obj,"eye")
print(res)   # return true 

# 类
res = hasattr(Children,"eat123")
print(res)   # return false

getattr

# getattr() 获取对象/类成员的值
# 属性或方法


class Father():
	pass

class Mother():
	pass
	
class Children(Father,Mother):
	eye = "蓝色的"
	weight = "1吨"
	
	def eat(self):
		print("小孩下生会喝奶")
	
	def drink(self):
		print("小孩下生喜欢喝勇闯天涯...")
		
	def __la(self):
		print("小孩自动啦,无法控制")

# 对象
res = getattr(obj,"weight")
print(res)
# 如果获取的值不存在,可以设置第三个参数,防止报错
res = getattr(obj,"weight123","抱歉这个值不存在")
print(res)


# 方法
# 通过类进行反射 (反射出来的是普通方法)
func = getattr(Children,"drink")
print(func)   #  <class 'function'>
func(1)


# 通过对象进行反射 (反射出来的是绑定方法)  自动传参了
func = getattr(obj,"drink")
print(func)   # <bound method Children.drink of <__main__.Children object at 0x000001394205B550>>
func()

setattr

# 设置对象/类成员的值
# 属性或方法
class Father():
    pass


class Mother():
    pass


class Children(Father, Mother):
    eye = "蓝色的"
    weight = "1吨"

    def eat(self):
        print("小孩下生会喝奶")

    def drink(self):
        print("小孩下生喜欢喝勇闯天涯...")

    def __la(self):
        print("小孩自动啦,无法控制")


obj = Children()
# 对象
setattr(obj, "skin", "黑人")
print(obj.skin)  # 黑人

# 类
setattr(Children, "skin", "土耳其人")
print(Children.skin)  # 土耳其人
print(obj.skin)   # 黑人

delattr

# 设置对象/类成员的值
# 属性或方法
class Father():
    pass


class Mother():
    pass


class Children(Father, Mother):
    eye = "蓝色的"
    weight = "1吨"

    def eat(self):
        print("小孩下生会喝奶")

    def drink(self):
        print("小孩下生喜欢喝勇闯天涯...")

    def __la(self):
        print("小孩自动啦,无法控制")


obj = Children()
# 对象
delattr(obj,"skin")
print(obj.skin)

# 类
delattr(Children,"skin")
print(Children.skin)

Reflect反射的使用

# 当前文件作为模块有一些方法
def func1():
    print("我是func1方法")


def func2():
    print("我是func2方法")


def func3():
    print("我是func3方法")


import sys

print(sys.modules)  # 系统字典  系统引用的模块  key 模块名  value obj
module = sys.modules["__main__"]
print(module,type(module))    # <module '__main__' from 'C:\\Users\\wbcde\\Desktop\\test\\main.py'> <class 'module'>
res = getattr(module, "func1")
print(res)   # 普通函数 <function func1 at 0x000001AF1203E310>






while True:
	strvar = input("请输入你想要使用的功能:")
	if hasattr(module,strvar):
		func = getattr(module,strvar)
		func()
	elif strvar.upper() == "Q":
		print("再见")
		break
	else:
		print("没有该成员~!")

标签:反射,obj,self,class,Reflect,print,Children,def
From: https://www.cnblogs.com/wbcde116/p/18083825

相关文章

  • 反射的应用场合
    编译时类型和运行时类型在Java程序中许多对象在运行是都会出现两种类型:编译时类型和运行时类型。编译时的类型由声明对象时实用的类型来决定,运行时的类型由实际赋值给对象的类型决定。如:Personp=newStudent();其中编译时类型为Person,运行时类型为Student。程序在运行......
  • 动态代理和反射的基本学习
    今天在跟着视频学习的时候发现老师讲的知识点都只简单的了解过但是没有深入学习,导致在跟着视频敲代码的时候完全不知道自己是在写什么东西。所以决定先把基础补一补再继续跟老师做项目。打算先把自定义注解的编写和解析学好,想要学号这一块,又涉及到了Aop和java中反射的学习,那么话......
  • FSM状态机及C#反射实现逻辑
    零、大致逻辑1.初始化Start组件->状态->状态内部初始化->进入初始状态2.运行时Update遍历状态的所有条件->不满足所有条件对象->执行当前状态运行时逻辑->进行一次玩家搜索满足某一个条件对象->执行当前状态退出逻辑->执行状态改变->执行新状态进入逻辑->执行新状态运行时......
  • 面试官:说说反射的底层实现原理?
    反射是Java面试中必问的面试题,但只有很少人能真正的理解“反射”并讲明白反射,更别说能说清楚它的底层实现原理了。所以本文就通过大白话的方式来系统的讲解一下反射,希望大家看完之后能真正的理解并掌握“反射”这项技术。1.什么是反射?反射在程序运行期间动态获取类和操纵类的......
  • 程序人生——Java泛型和反射的使用建议
    目录引出泛型和反射建议93:Java的泛型是类型擦除的建议94:不能初始化泛型参数和数组建议95:强制声明泛型的实际类型建议96:不同的场景使用不同的泛型通配符建议97:警惕泛型是不能协变和逆变的建议98:建议采用的顺序是List,List,List建议99:严格限定泛型类型采用多重界限建议1......
  • 提高反射的效率
    使用委托调用比直接调用慢10%,使用反射是直接调用的600倍,当然这取决于方法内部是否还外拉数据,但是反射转委托调用的好处显而易见所以我们需要使用反射和泛型方法来动态创建委托,并通过这些委托来调用特定的方法先创建一个带有返回值的publicclassRegisterDemo{privatest......
  • WARNING: An illegal reflective access operation has occurred
    想了很久也没有弄明白是什么原因导致了控制台输出了这个警告,后面在网上查了查资料,发现是这么一回事:在JDK8之前(包括java8),Java允许通过反射机制访问所有的成员,这些成员的类型包括私有(private),公共(public),包(<package>)和受保护(protected)。JDK9新增的功能之一——模块系......
  • go反射实战
    文章目录demo1数据类型判断demo2打印任意类型数据demo1数据类型判断使用reflect.TypeOf()方法打印go中数据类型,可参考go官方API文档;使用格式化参数%T也能打印数据类型。packagemainimport"fmt"import"reflect"import"io"import"os"funcmain(){ T......
  • 面试官:说说反射的底层实现原理?
    反射是Java面试中必问的面试题,但只有很少人能真正的理解“反射”并讲明白反射,更别说能说清楚它的底层实现原理了。所以本文就通过大白话的方式来系统的讲解一下反射,希望大家看完之后能真正的理解并掌握“反射”这项技术。1.什么是反射?反射在程序运行期间动态获取类和操纵类的......
  • Java反射和注解基本用法
    Java注解和反射Java注解什么是注解Annotation是从JDK5.0开始引入的新技术Annotation作用:不是程序本身,可以对程序做出解释可以被其他程序(比如编译器)读取Annotation格式:注解是以@注解名在代码中存在的,还可以添加一些参数值,例如:@Service(value="")Annotation在哪......