- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 Python 中使用 wxWidgets 库(通过 wxPython 包装器)。我正在尝试实现一个类 PaddedStaticText,它的行为与 WX StaticText 类相同,但每一侧都有一个用户可配置的填充。理想情况下,PaddedStaticText 将是 StaticText 的直接替代品。那种尖叫“子类化”,对吧?不幸的是,我认为如果我要子类化 StaticText,我基本上必须重新实现它的所有绘图例程,而我没有 WX 专业知识来做到这一点。
我想出的解决方案是实现一个具有 StaticText 属性的类,该属性将放置在几个 Sizers 中以影响填充:
class PaddedStaticText(wx.Window):
def __init__(self, parent, label='', padding=(0, 0, 0, 0), **kwargs):
wx.Window.__init__(self, parent)
self.text = wx.StaticText(self, label=label, **kwargs)
inner_sizer = wx.BoxSizer(wx.VERTICAL)
inner_sizer.Add((0, padding[0]))
inner_sizer.Add(self.text, proportion=1, flag=wx.EXPAND)
inner_sizer.Add((0, padding[2]))
outer_sizer = wx.BoxSizer(wx.HORIZONTAL)
outer_sizer.Add((padding[3], 0))
outer_sizer.Add(inner_sizer, proportion=1, flag=wx.EXPAND)
outer_sizer.Add((padding[1], 0))
self.SetSizer(outer_sizer)
这个类继承自 wx.Window,所以它可以用在许多我可以使用 StaticText 的相同上下文中——例如,将它添加到 Sizer。但是,由于 PaddedStaticText 实际上不是 StaticText,我不能只对其中一个实例调用 SetFont()。我必须制作自己的代理方法:
def SetFont(self, *args, **kwargs):
self.text.SetFont(*args, **kwargs)
当然,我必须为我希望可用的每个 StaticText 方法编写这样一个 stub 。这种方法有效,但一点也不优雅。我想在 Python 中一定有更好的方法来做这样的事情。
基于 this SO answer我写了这个简单的代理类:
class Proxy(object):
def __init__(self, underlying_object):
self._underlying_object = underlying_object
def __getattribute__(self, name):
obj = object.__getattribute__(self, '_underlying_object')
return object.__getattribute__(obj, name)
然后我可以将 PaddedStaticText 表示为 Proxy 的子类,并将 underlying_object
设置为 StaticText 实例。不幸的是,当我尝试将新的 PaddedStaticText 实例添加到 Sizer 时,WX 犹豫不决。因为它是 C++ 库的包装器,我猜 WX 并不真正尊重 Python 的鸭子类型:即使 PaddedStaticText 可以在调用 StaticText 方法时做出适当的响应,wxPython 所关心的只是它继承自 Proxy 而不是来自 wx.Window。
从那里开始,我简单地尝试了让 PaddedStaticText 从 Proxy 和 wx.Window 继承,但这没有用(无论如何它是一个继承菱形的例子)。如何以 Just Works 的方式实现我的 PaddedStaticText 类?对于我的解决方案想法或解决问题的完全不同的建议,我将不胜感激。
最佳答案
我会做的是:
class PaddedStaticText(wx.Window):
def __init__(...):
self.text = ...
...
def __getattr__(self, name):
'''delegate missing attributes to text'''
return getattr(self.text, name)
它通过故障转移扩展了您的基本继承方法(__getattr__
仅在没有其他工作时才被调用)到委派。
这使事情接近 wxwindows 所期望的,并减少了魔法的数量,但仍然允许您访问诸如 SetFont
之类的东西。
或者,如果您要使用 .text
(而不是 .__text
),那么您可以使用它:
foo = PaddedStaticText(...)
foo.text.SetFont(...)
但您将无法替换现有的 StaticText 实例。
[edit] 已经晚了,所以我明天可能会改进这个,但是如果您需要使用 __getattribute__
那么我建议您明确说明您想要的方法。它更多的是打字,但根据我的经验,python 中的全自动代理通常最终会以令人讨厌的方式让你大吃一惊。所以像这样:
def __getattribute__(self, name):
if name in ('SetFont', ...):
return getattr(self.text, name)
else:
return super(...).__getattribute__(self, name)
或(可能更快,但每个实例消耗更多内存):
def __init__(...):
self.text = ...
for name in ('SetFont', ...):
setattr(self, name, getattr(self.text, name))
关于python - 实现代理对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19278411/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!