Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在win32com中通过属性重写setter

在win32com中通过属性重写setter
EN

Stack Overflow用户
提问于 2019-03-30 04:20:03
回答 2查看 731关注 0票数 1

我使用win32com控制Python中的Visio。

获取和设置形状表值就像:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(shp.CellsU('PinX').ResultStr(''))
# and
shp.CellsU('PinX').FormulaU = '1'

到目前为止,还不错,但我希望通过重写setter和getter来获得更短的语法,以获得如下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(shp.PinX)
# and
shp.PinX = '1'

所以我去买了一处房产

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ShapeClass = type(shp)

def SetPinX(self,value):
    self.CellsU('PinX').FormulaU = value

def GetPinX(self):
    return self.CellsU('PinX').ResultStr('')

ShapeClass.PinX = property(GetPinX,SetPinX)

现在奇怪的结果---- getter工作得很好(打印(shp.PinX)给出了期望值),但是设置器不能工作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
~\AppData\Local\conda\conda\envs\YG_Package_1\lib\site-packages\win32com\client\__init__.py in __setattr__(self, attr, value)
    478                 try:
--> 479                         args, defArgs=self._prop_map_put_[attr]
    480                 except KeyError:

KeyError: 'PinX'

During handling of the above exception, another exception occurred:

AttributeError                            Traceback (most recent call last)
<ipython-input-28-23f68b65624d> in <module>()
----> 1 shp.PinX= '1'

~\AppData\Local\conda\conda\envs\YG_Package_1\lib\site-packages\win32com\client\__init__.py in __setattr__(self, attr, value)
    479                         args, defArgs=self._prop_map_put_[attr]
    480                 except KeyError:
--> 481                         raise AttributeError("'%s' object has no attribute '%s'" % (repr(self), attr))
    482                 self._oleobj_.Invoke(*(args + (value,) + defArgs))
    483         def _get_good_single_object_(self, obj, obUserName=None, resultCLSID=None):

AttributeError: '<win32com.gen_py.Microsoft Visio 15.0 Type Library.IVShape instance at 0x85710888>' object has no attribute 'PinX'

dir(ShapeClass)可以很好地显示属性PinX。

用自己的类进行测试也是有效的。这样,错误就不会发生在我实现属性的方式上。

我怀疑win32com在设置器被覆盖时有问题。

有谁知道如何解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-03 02:54:09

win32com.client.DispatchBaseClass基类使用__setattr__来拦截all属性设置访问。这会影响您的属性对象;属性设置程序只能由默认的object.__setattr__实现调用,而不是由win32com使用的自定义方法调用。

因此,是的,shp.PinX = '1' 将调用DispatchBaseClass.__setattr__('PinX', '1'),即使在类上定义了名为PinX的数据描述符,这将失败,因为它只支持COM接口定义的属性。

您必须在这里重写__setattr__方法,以首先检查可用的属性。您可以是子类DispatchBaseClass,也可以是特定生成的类,或者我们可以直接对win32com进行猴子补丁:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import inspect
from win32com.client import DispatchBaseClass

dispatch_setattr = DispatchBaseClass.__setattr__

def allow_datadescriptor_setattr(self, name, value):
    # for non-private names, check if the attribute exists on the class
    # and is a data descriptor. If so, use object.__setattr__ to permit
    # the data descriptor to intercept attribute setting
    if name[:1] != '_' and inspect.isdatadescriptor(getattr(type(self), name, None)):
        return object.__setattr__(self, name, value)
    # private name, or doesn't exist on the class, or not a data descriptor
    # invoke the original win32com dispatch __setattr__
    dispatch_setattr(self, name, value)

DispatchBaseClass.__setattr__ = allow_datadescriptor_setattr

以上允许任何 method拦截其名称的赋值,而不仅仅是property对象。

票数 4
EN

Stack Overflow用户

发布于 2019-04-01 04:01:27

您正在混合.Formula和.ResultStr方法。一个牢房可以有:

.Formula .FormulaU .Result .ResultU .ResultStr .ResultStrU

.FormulaForce .FormulaForceU

在您的代码中,您使用.ResultStr获取单元格内容,使用.FormulaU设置单元格。我建议您查看Visio,以了解所有这些之间的差异。如果单元格具有受保护的公式/值,则需要使用.FormulaForce方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55431363

复制
相关文章
python @property 设置只读属性 重写 getter setter 方法
@property广泛应用在类的定义中,可以让调用者写出简短的代码,就可以重写属性的 get 和 set 方法,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。
onety码生
2018/11/21
2.6K0
Vue3中计算属性的Setter
tips:在Vue3中,计算属性我们使用它的Setter计算属性的使用方式是变量里面放入 set(参数)和get()方法example:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scal
软件架构师Michael
2022/09/11
8210
计算属性的setter和getter
        刚才通过计算lastName和firstName获取了整个姓名,当时我们只是通过一直的data对象中属性进行合成的,这个也就是计算属性(computed)的get方法(默认),实质上还有一个set方法,我们来看一下getter和setter;
十月梦想
2018/10/09
1.2K0
通过getter获取setter函数
放在:https://gitee.com/dromara/stream-query
阿超
2023/06/23
1440
在 Vue.js 中通过计算属性动态设置属性值
前面我们已经陆续介绍了 Vue.js 框架的常用基本语法,现在,我们可以结合这些语法实现一个小功能:展示一个 Web 框架列表,并支持新增框架。
学院君
2023/03/03
12.7K0
在 Vue.js 中通过计算属性动态设置属性值
js对象属性的getter和setter
版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/article/details/53996012
空空云
2018/09/27
3.2K0
Groovy 创建索引属性Getter和Setter方法
在Groovy中,我们可以在类中定义属性,并自动在类文件中生成这些属性的getter和setter方法。 如果我们有一个Collection类型属性,我们通常会获得此属性的get/set方法。 但是根据JavaBean规范,我们可以将Collection类型属性定义为索引属性。 这意味着我们需要一个带索引参数的额外get/set方法,因此我们可以直接在属性中设置元素的值:
白石
2019/09/18
2K0
vue之计算属性的setter和getter
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <h2>{{fullName}}</h2> </div> <script src="../js/vue.js"></script> <script> const app = new Vue({
兮动人
2021/06/11
8340
vue之计算属性的setter和getter
通过getter和setter方法访问和修改
2.setter方法可以执行错误检查,比如检查数据是否合乎规范,输入的age是否小于0,直接对域操作则没这种优势
用户7999227
2021/10/08
9870
Vue 中 Computed 踩坑记 — no setter
在Vue项目中出现如下错误提示: [Vue warn]: Computed property "totalPrice" was assigned to but it has no setter. (found in <Anonymous>) 代码:
用户9914333
2022/07/22
6690
iOS基础·属性的修饰词与setter的关系
可以自己手动为实例变量在头文件 中声明setter、getter方法,并在实现文件中实现setter、getter方法。你也可以不声明不实现,但不要再企图调用setter、getter方法了,甚至点语法。
陈满iOS
2018/09/10
1.1K0
PHP-私有属性继承和重写
1.3 面向对象三大特性 封装 继承 多态 1.4 私有属性继承和重写 私有属性可以继承但不能重写。 <?php class A { private $name='PHP'; public fun
cwl_java
2022/11/30
6270
在Springmvc中获取properties属性
一些关键的属性一般都会拿出来作为配置,比如数据库连接等。在springmvc中也提供了获取property的类,比如@Value来获取。我接触spring很浅,基本上都是百度的问题解决方法,百度到@value的用法,按照说明尝试了两次都失败了。正巧身边又有合适的方法,于是便没有去深入研究为什么失败,这个留在以后研究。下面就是获取代码: 源码来自:https://github.com/thinkgem/jeesite 1 package com.demo.common.utils; 2 3 im
Ryan-Miao
2018/03/13
3.4K0
getter和setter怎么用_python setter
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/14
3860
为什么要用Getter和Setter方法,而不是公开属性
大多数字段的访问都是通过Getter和Setter方法来间接访问,为什么不直接将字段设置为公开属性Public呢?答案在于前者的未来可能性。当我在Java语言编程中开始我的职业生涯时,我就对Getter和Setter感到困惑。为什么要这么写呢?为什么不直接用Public呢?这对我来说是个奇怪的语法。
三哥
2018/12/17
2.2K1
为什么要用Getter和Setter方法,而不是公开属性
【Android Gradle 插件】Gradle 扩展属性 ④ ( 扩展属性访问方式 | 直接访问扩展属性 | 通过 ext 对象访问 | 在 gradle.properties 中定义扩展属性 )
也可以 通过 project.ext.hello 访问该扩展属性 , 代码如下 :
韩曙亮
2023/03/30
2.5K0
【Android Gradle 插件】Gradle 扩展属性 ④ ( 扩展属性访问方式 | 直接访问扩展属性 | 通过 ext 对象访问 | 在 gradle.properties 中定义扩展属性 )
类的继承 方法和属性的重写
当子类和父类进行同一件事进行不同的操作需要重新写方法(例如电脑鼠标点击打开图片,平板电脑触摸打开图片)
用户2965768
2019/01/28
1.5K0
activiti通过扩展点重写节点行为
在activit项目中,有时需要重写节点的behaviour,但如果将代码反编译,会为后续升级,及项目打包带为不方便。   其实 acitivit已经提供了扩展点重写节点行为。 重写办法如下:
星痕
2018/09/12
2.5K0
点击加载更多

相似问题

WPF重写setter属性

21

如何重写属性setter?

10

重写属性setter和getter

21

重写类类别中的属性setter

30

子类中重写属性setter的特性

43
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文