Python:具有__slots__时如何写__repr__

问题描述

我想知道如何为带有class FetchWording: ObservableObject { func fetch (pID: String) -> String { let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Translation") fetchRequest.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [nspredicate(format: "id == %@",pID as CVararg),nspredicate(format: "language == %@",sdisplayLanguage as CVararg)]) fetchRequest.fetchLimit = 1 do { let fetchWording = try ContentView().managedobjectContext.fetch(fetchRequest) print (fetchWording[0]) } catch { print ("Error") } return (“See you later when it’s working”) } } 的类实现__repr__方法。据我了解__slots__,它应该返回一个字符串,该字符串可用于构造我们称为__repr__的对象。换句话说,将__repr__赋予Python解释器应构造repr(object)

但是,如果有一个具有object的类,我很难想象如何实现这一点。这是因为使用__slots__时,插槽中的某些属性可能会初始化并具有值,而其他属性可能不会。那么,如何确定初始化了哪些属性以及将它们传递到__slots__字符串的值?

此类的最小示例:

__repr__

有什么建议吗?

解决方法

据我了解,__repr__应该返回一个字符串,该字符串可用于构造我们称为__repr__的对象。换句话说,将repr(object)赋予Python解释器应构造对象。

这只是一个建议,而不是强加于人:

如果可能的话,这应该看起来像一个有效的Python表达式,可以用来重新创建具有相同值的对象(在适当的环境下)。如果无法做到这一点,则应返回格式为<...>的字符串。

“如果可能的话”的解释非常松散和微弱,许多对象根本不会打扰,例如类或函数的表示形式可以产生其源表示形式,但不会,因为它的用例很少,而且烦人的比有用的。

但是,如果有一个具有__slots__的类,我很难想象如何实现这一点。这是因为使用__slots__时,插槽中的某些属性可能会被初始化并具有值,而其他属性可能不会。

当然不是。我从来没有写过带有插槽的课程,在该课程中并非所有时间都被填满。另外,hasattr / getattr在插槽中也可以正常工作。

尽管我不得不问:您是在从事{@ {1}}的货运培训吗?有人曾经告诉过您使用插槽,现在您到处都在使用它们吗?

插槽是一种内存优化工具,例如,重点是每个成员仅需要一个指针(加上一些对象开销),而不是dict实例(及其摊销的重新分配)的开销。当您通常不使用插槽时,使用插槽几乎没有意义,而在插槽中添加__slots__则毫无意义。

更不用说最近的Python 3迭代为实例指令增加了各种优化,至少在属性数量增加的情况下,使插槽变得更没用了(在3.6以上的相当大的类上,我们发现相差不到5%,尽管小班学习还是很有意义的。)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...