- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
更新 2013-02-08
我现在明白了为什么我无法在一小段测试代码中重现这个问题。在小程序中,Python 的垃圾收集器不是很活跃。我认为问题在于 Python 正在收集一些仅在 GObject 中引用的对象。我认为这是涉及 this bug 的回归,或新的类似错误。
我想通了,因为我再次遇到了同样的问题,但是我自己的类(它只引用了 GObject 对象)——这次整个 dict 在对象上被清除了.如果我使用代码 here监视消失的属性之一,它不会消失!似乎额外的引用保留了属性。这闻起来像垃圾收集器问题。我通过在初始化期间将对象添加到全局列表来确认这一点...这也解决了现在发生的问题。
我在使用 PyGTK GUI 时遇到了一些奇怪的行为。我有一个不断丢失大量属性的对象。我正在尝试确定这是否是我的代码、Python 解释器或 PyGTK 中的错误。
我没有调用 delattr()
。我尝试通过使用总是引发异常的代码覆盖 __delattr__()
来检测是否有任何东西正在调用我的对象的 __delattr__()
方法。我能够重现导致对象失去其属性的事件,但从未引发异常。我不确定是否有其他方法可以找出是什么函数调用(如果有的话)导致对象丢失属性。
有问题的对象一直运行良好,直到它突然失去我试图访问的属性。
在 GUI 中执行一些与丢失属性的对象无关的操作后,属性丢失始终发生。我偶然发现了它;可能还有其他操作导致对象失去其属性。
我已将 print id(self)
添加到访问消失属性的方法中。属性消失前后打印的id是一样的。
关于如何追踪此问题的根源有什么建议吗?
引用代码如下: (注意:如果/当我想出一个可重现问题的简化测试用例时,我将更新此代码。现在重现该问题所需的总代码错误太大,无法在此处发布。)
这是我的对象的类,它失去了它的属性。这显然是真实功能代码的最小化版本,但我正在使用它进行调试,但问题仍然存在。
它是我的自定义 MenuBar
类的子类。请注意,on_file_import__activate()
方法通过父类之一连接到菜单项的信号。
class FluidClassManagerWindowMenu(MenuBar):
menu_items = [("File",("Import",))]
def __init__(self, parent):
# XXX: different name than self.parent to see if it stops disappearing
self._xxx_my_parent = parent
MenuBar.__init__(self, parent)
def __delattr__(self,attr):
# XXX: trying to find the cause for lost attributes
traceback.print_stack()
def on_file_import__activate(self, widget=None, data=None):
# XXX: this is the same before and after the attributes disappear
print id(self)
# XXX: print the list of attributes to see what disappears
print dir(self)
# XXX: this works until the _xxx_my_parent attribute disappears
print self._xxx_my_parent
如果您好奇,这里是我的 MenuBar 类的完整源代码。这是一个pygtkhelpers SlaveView
,继承自GObject
。 pygtkhelpers 委托(delegate)将自动信号连接到上面的 on_file_import__activate
方法。
class MenuBar(pygtkhelpers.delegates.SlaveView):
def __init__(self, parent):
SlaveView.__init__(self)
self.parent = parent
def create_ui(self):
menu_bar = gtk.MenuBar()
menu_bar.set_pack_direction(gtk.PACK_DIRECTION_LTR)
for menu_name, items in self.menu_items:
menu = gtk.Menu()
submenu = gtk.MenuItem(menu_name)
submenu.set_submenu(menu)
for item_name in items:
if not item_name:
menu.append(gtk.MenuItem())
continue
menuitem = gtk.MenuItem(item_name)
fixed_item_name = item_name.lower().replace(' ','_')
fixed_menu_name = menu_name.lower().replace(' ','_')
attr_name = '%s_%s' % (fixed_menu_name,fixed_item_name)
# set an attribute like self.edit_vial_layout
# so pygtkhelpers can find the widget to connect the signal from
setattr(self,attr_name,menuitem)
menu.append(menuitem)
menu_bar.append(submenu)
self.vbox = gtk.VBox()
self.vbox.pack_start(menu_bar)
self.vbox.show_all()
self.widget.add(self.vbox)
从对象中消失的属性列表:
'_model', '_props', '_toplevel', '_xxx_my_parent', 'file_import', 'parent', 'slaves', 'testtesttest', 'vbox', 'widget'
parent
属性是最初消失的;我尝试将其值分配给 _xxx_my_parent
ManagerWindowMenu.__init__()
但它也消失了。我还在 MenuBar.__init__
中添加了一个我从未访问过的新属性,称为 testtesttest
,它也消失了。
最佳答案
请记住,PyGTK 中的对象通常继承自 GObject。 GObject 框架内可能发生了导致您丢失属性的事件。
关于python - 如何找出 Python 对象丢失属性的原因/时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5346578/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!