我的Python类看起来有点像这样:
class some_class:
def __getattr__(self, name):
# Do something with "name" (by passing it to a server)
有时,我正在使用ptpython
(一个交互式Python shell)进行调试。 ptpython
检查类的实例并尝试访问不存在的__objclass__
属性。在__getattr__
中,我可以在使用if name != "__objclass__"
之前检查name
,但我想知道是否有更好的方法可以正确实施或以某种方式存根{{1} }}。
Python documentation对此并不多说,或者至少我不明白我必须做什么:
属性
__objclass__
由__objclass__
模块解释为指定定义此对象的类(适当地设置它可以帮助运行时对动态类属性进行内省)。对于callables,它可能表示期望类型(或子类)的实例是第一个位置参数(例如,CPython为在C中实现的未绑定方法设置此属性)。
答案 0 :(得分:3)
您希望避免干扰此属性。没有理由手动进行任何类型的存根 - 你想要摆脱困境并让它做它通常做的事情。如果它的行为与通常的属性相同,那么一切都会正常工作。
因此,正确的实施方式是__objclass__
函数中__getattr__
属性的特殊情况,并抛出AttributeError
。
class some_class:
def __getattr__(self, name):
if name == "__objclass__":
raise AttributeError
# Do something with "name" (by passing it to a server)
这样,它的行为方式与没有__getattr__
的类的行为相同:默认情况下,该属性被认为是不存在的,直到它被分配给。如果该属性已存在,则不会调用__getattr__
方法,因此可以毫无问题地使用它:
>>> obj = some_class()
>>> hasattr(obj, '__objclass__')
False
>>> obj.__objclass__ = some_class
>>> obj.__objclass__
<class '__main__.some_class'>