因此,我在查看pathlib源代码时,注意到一些os-lib函数被嵌入到pathlib类中。我必须承认,我花了一点时间才明白这是怎么回事。
import os
class Foo:
listdir = os.listdir
join = os.path.join
walk = os.walk
def __init__(self, name):
self.name = name
def __fspath__(self):
return self.name
curr = Foo('.')
pipo = Foo('pipo')
该类定义将os库的listdir、join和walk函数添加为Foo类上的方法。Foo类被识别为类路径对象,因为它还具有
__fspath__
方法
什么时候
curr.join('bar')
它将加入curr的名字,用“酒吧”。下面的代码显示了这种确切的行为,并给出了我所期望的结果。
$ tree
.
âââ pipo
â âââ clown
âââ test.py
1 directory, 2 files
$
>>> curr.join("baz")
./baz
>>>
>>> pipo.join("baz")
pipo/baz
>>>
>>> [x for x in curr.walk()]
[('.', ['pipo'], ['test.py']), ('./pipo', [], ['clown'])]
>>>
>>> [x for x in pipo.walk()]
[('pipo', [], ['clown'])]
>>>
然后我尝试了listdir函数。。。而且
失败
.listdir函数显示了不同的行为,我很困惑为什么?
>>>
>>> os.listdir()
['pipo', 'test.py']
>>>
>>> curr.listdir()
['pipo', 'test.py']
>>>
>>> os.listdir("pipo")
['clown']
>>>
>>> pipo.listdir()
['pipo', 'test.py']
>>>
pipo上的listdir方法显示的输出与curr上的listdir相同?
在我看来
join
和
walk
接受自我介绍,但不知何故
listdir
没有。为什么会这样?