首页 > 编程语言 >Python高阶---反射

Python高阶---反射

时间:2024-05-06 14:55:05浏览次数:27  
标签:name Python dog choice --- getattr print 高阶 属性

======================================

反射:

hasattr: 输入一个字符串,判断对象有没有这个方法或属性

getattr: 获取对象属性或方法的引用。

如果是方法,则返回方法的引用;

如果是属性,则直接返回属性值;

如果该方法或属性不存在,则抛出异常。

setattr: 动态添加一个方法或属性

delattr: 动态删除一个方法或属性

======================================

def talk():
print('二哈汪汪汪...')

class Dog:
def init(self, name):
self.name = name

def eat(self):
    print('{}正在吃'.format(self.name))

def sleep(self):
    print('{}正在睡'.format(self.name))

dog = Dog('二哈')
choice = input('请输入要执行的方法名称:') #

print(hasattr(dog, choice))

if hasattr(dog, choice):
try:
func = getattr(dog, choice) # getattr返回方法的引用
func() # 调用方法
except TypeError as e:
print(getattr(dog, choice))
else:
print("输入的方法不存在,请检查!")

attr = input("请输入要添加的属性名:")
value = input("请输入要添加的属性值:")
if value.isdigit():
# 如果用户输入的属性值为数值型
setattr(dog, attr, int(value)) # 动态绑定属性
else:
# 如果用户输入的属性值不是数值型
setattr(dog, attr, value)

print(dir(dog))
if hasattr(dog, attr):
print(getattr(dog, attr)) # 打印出我们之前设置的属性值

choice = input('请输入要设置的方法名:')
setattr(dog, choice, talk) # 通过choice指向实际要绑定的函数
getattr(dog, choice)()
print(dir(dog))

delattr(dog, choice)
getattr(dog, choice)()

========================

eval(expression, globals=None, locals=None)

exec(obj, [, globals[, locals]])

x = 10

def func():
y = 20
a = eval('x+y') # x=10, y=20
print("a=", a)
b = eval('x+y', {"x": 1, "y": 2}) # 计算中使用的是x=1,y=2
print("x=", x, "y=", y)
print("b=", b) #

c = eval('x+y', {"x": 1, "y": 2}, {"x": 3, "y": 4})   # 计算中使用的是x=3,y=4
print("x", x, "y", y)
print("c=", c)

d = eval('x+y', {"x": 1, "y": 2}, {"x": 3, "z": 5})   # 计算中使用的是x=3,y=2
print("x", x, "y", y)
print("d=", d)        # d = 5

func()

======================================

x = 1
y = exec('x = 1+1') # exec不会返回值
print(x) # x = 2
print(y) # None
exec('a=[]\na.append(2)')
print(a) # [2]

a = '[1,2,3,4,5]'
print(type(a))
print(type(eval(a)))
print(type(a))

a = "mydict = {'name':'jack'}"
print(type(a))
exec(a)
print(mydict)
print(type(mydict))

======================================

标签:name,Python,dog,choice,---,getattr,print,高阶,属性
From: https://www.cnblogs.com/jackchen28/p/18175007

相关文章

  • dubbo-AdaptiveLoadBalanceFilter
    消费者端使用自适应负载方式dubbo负载方式介绍随机、循环负载平衡、最少活动、参数的一致性哈希、成功调用响应时间最短、自适应负载平衡AdaptiveLoadBalanceFilter内部使用ThreadPoolExecutor线程池处理,核心、最大线程数据为1,队列为1024个初始化ThreadPoolExecutor方式为双......
  • AdaZoom: Towards Scale-Aware Large Scene Object Detection 论文解读
    《AdaZoom:TowardsScale-AwareLargeSceneObjectDetection》笔记1.研究动机1.1挑战与困难小目标检测和对象尺度差异存在挑战现有研究方法对于大场景中如此极端尺度变化的物体缺乏灵活性,缺乏对不同尺度物体的适应性。1.2解决方案构建了一个自适应缩放网络(简称AdaZoom),对......
  • Echarts -- 实现动态加载series
    Echarts--实现动态加载series:https://blog.csdn.net/m0_74444744/article/details/134467184?ops_request_misc=&request_id=&biz_id=102&utm_term=echarts%20series&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-1344671......
  • 78. 子集-c++
    给你一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可以按任意顺序返回解集。示例1:输入:nums=[1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例2:输入:nums=[0]输出:[[],[0]]classSolution{......
  • 如何用Python开发一个命令行工具
    如何编写一个python命令行工具importargparsedefparse_args():parser=argparse.ArgumentParser()parser.add_argument("-nc","--test_a",type=int,default=10,help="testA")parser.add_argument(&quo......
  • Dockerfile.oracle-注释学习
    innovation/Dockerfile.oracle##NOTE:THISDOCKERFILEISGENERATEDVIA"apply-templates.sh"##PLEASEDONOTEDITITDIRECTLY.##使用oraclelinux:8-slim基础镜像FROMoraclelinux:8-slim#set-eux也就是以调试的方式执行shell,只识别定义过的变量,同时脚......
  • MyBatis笔记2024-05-06
    MyBatis笔记第1章--MyBatis日志管理与动态SQL日志门面(统一调用接口2两种)与实现(常见:log4j、logback、java.util.logging...)LoggingFacadeForJavaApacheCommons-logs增加依赖:ch.qos.logbackMyBatis会自动调用logback配置文件:logback.xml固定文件名配置内容:指定类,输出格式,日志......
  • 基于WOA优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真
    1.算法运行效果图预览优化前:    优化后:   2.算法运行软件版本matlab2022a 3.算法理论概述       时间序列回归预测是数据分析的重要领域,旨在根据历史数据预测未来时刻的数值。近年来,深度学习模型如卷积神经网络(ConvolutionalNeuralNetwork,C......
  • Oh-My-Zsh 提示符只显示当前路径,不需要修改主题文件
    我真是服了。就这么一个简单的小问题我在网上找了一个多小时,一大堆CSDN文章都是抄同一篇博客的教程,所有的博客都要我去把~/.oh-my-zsh/themes/*.zsh-theme文件里面的PROMPT变量改掉。这个方法确实可以奏效,所幸我是只用Gruvbox,万一我要是使用随机配色方案,每个theme都改......
  • JavaGUI - [03] LayoutManager布局管理器
    Component中有一个方法setBounds()可以设置当前容器的位置和大小,但如果我们手动为组件设置位置和大小的话,就会造成程序的不通用性。LayoutManager布局管理器可以根据运行平台来自动调整组件大小,程序员不用再手动设置组件的大小和位置,只需要为容器选择合适的布局管理器即可。 ......