我对__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__
的方法?谢谢。
1条答案
按热度按时间htzpubme1#
作为第一个近似,当你写
字符串
Python尝试通过以下方式查找
a
:1.检查
obj
是否具有名为a
的属性,然后1.检查
obj
的类(obj.__class__
)是否具有属性a
,然后1.递归地检查每个父类(
obj.__class__.__mro__
)的属性a
。如果在任何时候,找到一个名为
a
的属性,那么该对象将作为结果返回。这就是Python中继承的含义。子类不会复制它们的父类,它们只是 * 委托 * 属性查找。现在,无论何时将类定义为
型
这个类对象 * 总是 * 被分配一个
__doc__
属性:如果提供了一个,则为docstring,否则为None
。型
因此,在找到匹配对象之前,对属性
__doc__
的任何查找都只会传播到类级别。属性查找永远不会到达检查父类的阶段。1完整的属性查找过程要复杂得多。请参见3.3.2.从Python数据模型文档中自定义属性访问以了解更大的情况。