1

我的 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,但我想知道是否有更好的方法通过正确实现或以某种方式存根__objclass__

Python文档并没有说太多,或者至少我不明白我必须做什么:

该属性__objclass__inspect模块解释为指定定义该对象的类(适当地设置它可以帮助动态类属性的运行时自省)。对于可调用对象,它可能指示期望或需要给定类型(或子类)的实例作为第一个位置参数(例如,CPython 为在 C 中实现的未绑定方法设置此属性)。

4

1 回答 1

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'>
于 2018-03-21T12:49:09.743 回答