我发现 pathlib 语法 - 或者它是 Python 语法 - 令人惊讶。我想知道这如何使正斜杠
/
充当 WindowsPath
等的连接符。它是否会覆盖/重载 /
?这似乎是在一个神奇的上下文中,斜杠位于 WindowsPath
类型对象和字符串之间。如果我在 2 个字符串之间尝试,它无法连接 2 个字符串(例如 "123" / "123"
失败)
p=pathlib.Path(".")
p
Out[66]: WindowsPath('.')
p.cwd()
Out[67]: WindowsPath('C:/Users/user1')
p.cwd() / "mydir"
Out[68]: WindowsPath('C:/Users/user1/mydir')
__truediv__
方法,它返回另一个 Path。您可以对自己的课程执行相同的操作:
>>> class WeirdThing(object):
def __truediv__(self, other):
return 'Division!'
>>> WeirdThing() / WeirdThing()
'Division!'
对于那些想简单查看源代码的人:
__truediv__
重载 /
运算符,并返回 self
,这是一个 Path
对象。
# this is where the magic begins! (overload the '/' operator)
def __truediv__(self, key):
try:
return self._make_child((key,))
except TypeError:
return NotImplemented
def _make_child(self, args):
drv, root, parts = self._parse_args(args)
drv, root, parts = self._flavour.join_parsed_parts(
self._drv, self._root, self._parts, drv, root, parts)
return self._from_parsed_parts(drv, root, parts)
@classmethod
def _from_parsed_parts(cls, drv, root, parts):
self = object.__new__(cls)
self._drv = drv
self._root = root
self._parts = parts
return self # finally return 'self', which is a Path object.
是的,它的工作原理是覆盖传统上专用于除法的 dunder 方法。 同样,当我第一次看到使用
@
运算符进行矩阵乘法时,我很震惊,经过一些研究发现它在幕后使用了 dunder 方法,__matmul__
(Python 中经常使用),除了这次从它的名字来看,它就是为此而设计的。
因此,您可以创建一个重写许多运算符(例如 ^、&、@、|、^=、&=、@=、|= 等)的类,并将它们用于除原始目的之外的其他目的,尽管这可能不是最佳实践。