Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >调用方法与设置

调用方法与设置
EN

Stack Overflow用户
提问于 2020-12-06 09:23:13
回答 1查看 65关注 0票数 0

比方说,我需要调用一个方法或更改类的一个属性,但我并不确切地知道它将是哪一个。现在,我的代码看起来像这样:

代码语言:javascript
运行
AI代码解释
复制
def change(obj, attr_name, val):
    attr = getattr(obj, attr_name, None)
    # check if attr exists
    if type(attr) == 'NoneType':
        print('no such attribute')
        return
   
    if callable(attr):
        attr(val)
    else:
        setattr(obj, attr_name, val)

然而,在我看来,它并不是很优雅。我用谷歌搜索了几天也没找到答案。

我用它来调用一个对象的方法,这个对象的名字我事先不知道。我从阅读python文献中了解到,在这种情况下使用getattr是有效的。然而,后来我开始用@property修饰我的一些方法,当我尝试用getattr(obj, attr_name)(value)调用它们时,我得到了一个错误。下面是用来说明我的问题的代码片段:

代码语言:javascript
运行
AI代码解释
复制
class myclass1:
    def __init__(self):
        self._a = 'hello'
    def getA(self):
        return self._a
    def setA(self, val):
        self._a = val

class myclass2:
    def __init__(self):
        self._a = 'hello'
    @property
    def A(self):
        return self._a
    @A.setter
    def A(self, val):
        self._a = val

def changeOLD(obj, attr_name, val):
    attr = getattr(obj, attr_name, None)(val)

obj1 = myclass1()
obj2 = myclass2()
changeOLD(obj1, 'setA', 'goodbye')
print(obj1.getA())

changeOLD(obj2, 'A', 'goodbye')
print(obj2.A)

当我运行它时:

代码语言:javascript
运行
AI代码解释
复制
$ python test.py
goodbye
Traceback (most recent call last):
  File "test.py", line 45, in <module>
    changeOLD(obj2, 'A', 'goodbye')
  File "test.py", line 37, in changeOLD
    attr = getattr(obj, attr_name, None)(val)
TypeError: 'str' object is not callable

所以我想我需要一种方法来区分属性和方法。

EN

回答 1

Stack Overflow用户

发布于 2020-12-06 09:35:54

您为所描述的用例提供的代码没有重大问题。不过,您可以做一些更改。

我会更改,这样您就可以检查None而不是None的类型。而且打印通常不是在处理逻辑的方法中完成的。你可能还想从你要调用的函数中返回值。最后,将方法名称更改为更合适的名称。

代码语言:javascript
运行
AI代码解释
复制
def set_or_call(obj, name, value):
    attr_or_function = getattr(obj, name, None)
    
    if attr_or_function is None:
        return None  # Or raise an exception if this is suppose to be an error.
    elif callable(attr_or_function):
        return attr_or_function(value)
    else:
        setattr(obj, attr_or_function, value)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65166481

复制
相关文章
canvas简单线条的绘制
1.绘制线条之前首先进行声明线条开始绘制代码context.beginPath;说明:context是画板中获得的绘画环境上述的是cv
十月梦想
2018/08/29
9580
canvas画布实现矩形的绘制
绘制一个实心矩形cv.fillRect(x,y,width,height)绘制之前声明绘制的实心矩形颜色使用fillStyle
十月梦想
2018/08/29
2.6K0
bootstrap 表格 带边框
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
用户5760343
2022/01/10
1.1K0
bootstrap 表格 带边框
软件测试|超好用超简单的Python GUI库——tkinter(十四)
我们知道我们可以使用pillow绘制不同形状的图形,但是我们能不能使用tkinter实现这个功能呢,当然可以,tkinter也可以实现图形的绘制,并且可以将绘制的图形添加到我们的GUI中。
霍格沃兹测试开发Muller老师
2023/06/02
9920
巧妙实现带圆角的渐变边框
border-image 是 CSS 规范 CSS Backgrounds and Borders Module Level 3 (最新一版的关于 background 和 border 的官方规范) 新增的一个属性值。
Sb_Coco
2020/02/21
7.1K1
巧妙实现带圆角的渐变边框
IOS – OpenGL ES 绘制线条 GPUImageLineGenerator
GPUImageLineGenerator 属于 GPUImage 图像处理相关,用来处理图片线条效果,shader 源码如下:
猿说编程[Python和C]
2023/03/25
5340
Canvas两点连线及多点连线
使用html5 Canvas绘制直线所需的CanvasRenderingContext2D对象的主要属性和方法(有”()”者为方法)如下:
javascript.shop
2019/09/04
9.4K0
H5-使用canvas绘制
canvas标签用于绘制图画,它是通过js来实现图画的绘制,这里将学习一下其基本用法。 首先,创建一个画布,这样我们就可以在上面进行创作了。
kdyonly
2023/03/03
9240
WPF 绘制对齐像素的清晰显示的线条
发布于 2017-12-12 13:49 更新于 2018-08-13 12:47
walterlv
2018/09/18
1.6K0
WPF 绘制对齐像素的清晰显示的线条
IOS开发 图形绘制,绘制线条,矩形,和垂直和居中绘制文字
假设把上面的方法放入到一个类 DrawUtil 中,我们可以通过 DrawUtil 来调用方法。
张云飞Vir
2020/03/16
1.8K0
用Python绘制棒棒糖图表,真的好看!
此外还可以调整lw、markersize参数,定义线条的粗细及标记的大小,甚至可以绘制两次线条以创建轮廓效果。
咋咋
2021/09/01
1.3K0
用Python绘制棒棒糖图表,真的好看!
canvas知识点
HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成. <canvas> 标签只是图形容器,您必须使用脚本来绘制图形。 你可以通过多种方法使用Canva绘制路径,盒、圆、字符以及添加图像。
HUC思梦
2020/09/03
8920
用Python绘制棒棒糖图表,真的好看!
此外还可以调整lw、markersize参数,定义线条的粗细及标记的大小,甚至可以绘制两次线条以创建轮廓效果。
小F
2021/05/17
1.5K0
用Python绘制棒棒糖图表,真的好看!
Canvas网页涂鸦板再次增强版
点击这里 http://qkongtao.cn//file/graffiti.html
不愿意做鱼的小鲸鱼
2022/09/24
1.3K0
Canvas网页涂鸦板再次增强版
flutter画布绘制图片和文字
本节目标: [1]. 了解如何获取 [ui.Image] 对象。 [2]. 将一张图片使用 Canvas 绘制出来。 [3]. 知道如何从图片中取出部分图片绘制到指定矩形域中。 [4]. 了解 Canvas 绘制图集的操作。 [5]. 如何在 Canvas 中绘制文字,并完善坐标系刻度。 ---- 一、图片绘制: image-20201030110334887 绘制图片需要的是 ui.Image,需要异步加载,这里用 loadImageFromAssets 处理。 PaperPainter 接收 u
用户1974410
2022/09/20
2.6K0
flutter画布绘制图片和文字
Python+matplotlib绘制海螺贝壳上美丽的线条
在海洋中的亿万只海螺中,大部分都是右旋螺纹,从底部看的话海螺开口在右边,如下图所示:
Python小屋屋主
2019/05/15
1.5K0
手写原生代码专题 | 简易手写画板(二)
如视频所示,在这个示例中,我们用到了画布 canvas 相关的知识,比如创建画布、画圆形、画直线的基础知识,有了这些基础后,我们就能轻松完成本示例,示例效果如下视频所示。
前端达人
2021/07/16
1.5K0
点击加载更多

相似问题

绘制带边框的线条

12

Java绘制带边框的线条

11

画布中带渐变的线条绘制

122

在画布android中绘制带边框的文本

14

使用画布绘制线条

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档