如何正确"存根" Python类中的__objclass__?

时间:2018-03-21 12:05:00

标签: python python-3.x class inspect

我的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中实现的未绑定方法设置此属性)。

1 个答案:

答案 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'>