Python中如何将属性调用转换为方法调用?以BeautifulSoup为例
BeautifulSoup Tag对象属性访问的实现原理
在Python中,访问对象不存在的属性时默认会抛出AttributeError,但BeautifulSoup的Tag类通过重写**__getattr__魔法方法**改变了这个默认行为:
- 当调用
tag.xxx时,如果xxx不是Tag的内置属性(比如name、attrs这类),Python会自动触发__getattr__方法 - Tag类的
__getattr__方法会把属性名xxx作为参数传递给find()方法,等价于执行tag.find("xxx") - 如果找不到对应标签,
find()会返回None,这就是调用tag.no_such_attrib时得到None而非报错的原因
举个代码例子验证逻辑:
from bs4 import BeautifulSoup html = "<div><p>Hello</p></div>" soup = BeautifulSoup(html, "html.parser") tag = soup.div # 以下两行代码完全等价 print(tag.p) print(tag.find("p"))
链式调用tag.anything.something的本质是tag.find("anything").find("something")——如果find("anything")返回新的Tag对象,后续的.something会继续触发该Tag的__getattr__方法,重复上述逻辑。
内容的提问来源于stack exchange,提问作者Neo Anderson
相关产品推荐
相关产品推荐

