python-3.x 子类不继承`__doc__`属性/方法的原因是什么?

svgewumm  于 2023-11-20  发布在  Python
关注(0)|答案(1)|浏览(102)

我对__doc__和其他方法之间的行为差异有点困惑:

# python 3.10.13
class Parent:
    def __init__(self, doc):
        self._doc = doc

    def __doc__(self):
        return self._doc
    
    def __other__(self):
        return self._doc

class Child(Parent):
    pass

>>> print(Parent("test").__doc__())
test

>>> print(Child("test").__doc__)
None # TypeError if call __doc__() since it is not defined
>>> print(Child("test").__other__())
test

字符串
但它也不能作为财产使用:

# python 3.10.13
class Parent:
    def __init__(self, doc):
        self._doc = doc

    @property
    def __doc__(self):
        return self._doc

    @property
    def __other__(self):
        return self._doc

class Child(Parent):
    pass

>>> print(Parent("test").__doc__)
test

>>> print(Child("test").__doc__)
None
>>> print(Child("test").__other__)
test


这在这里@22750354提到并进行了一些讨论,但我需要帮助找出为什么Child类没有继承__doc__的方法/属性。在继承方面是否有其他类似__doc__的方法?谢谢。

htzpubme

htzpubme1#

作为第一个近似,当你写

obj.a

字符串
Python尝试通过以下方式查找a
1.检查obj是否具有名为a的属性,然后
1.检查obj的类(obj.__class__)是否具有属性a,然后
1.递归地检查每个父类(obj.__class__.__mro__)的属性a
如果在任何时候,找到一个名为a的属性,那么该对象将作为结果返回。这就是Python中继承的含义。子类不会复制它们的父类,它们只是 * 委托 * 属性查找。
现在,无论何时将类定义为

class Child(Parent):
    ...


这个类对象 * 总是 * 被分配一个__doc__属性:如果提供了一个,则为docstring,否则为None

>>> Child.__doc__ is None
True


因此,在找到匹配对象之前,对属性__doc__的任何查找都只会传播到类级别。属性查找永远不会到达检查父类的阶段。
1完整的属性查找过程要复杂得多。请参见3.3.2.从Python数据模型文档中自定义属性访问以了解更大的情况。

相关问题