python pathlib 运算符 '/' - 它是如何做到的?

问题描述 投票:0回答:3

我发现 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')
python python-3.x pathlib
3个回答
62
投票

Path 类有一个

__truediv__
方法,它返回另一个 Path。您可以对自己的课程执行相同的操作:

>>> class WeirdThing(object):
        def __truediv__(self, other):
            return 'Division!'

>>> WeirdThing() / WeirdThing()
'Division!'

6
投票

对于那些想简单查看源代码的人:

__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.

0
投票

是的,它的工作原理是覆盖传统上专用于除法的 dunder 方法。 同样,当我第一次看到使用

@
运算符进行矩阵乘法时,我很震惊,经过一些研究发现它在幕后使用了 dunder 方法,
__matmul__
(Python 中经常使用),除了这次从它的名字来看,它就是为此而设计的。

因此,您可以创建一个重写许多运算符(例如 ^、&、@、|、^=、&=、@=、|= 等)的类,并将它们用于除原始目的之外的其他目的,尽管这可能不是最佳实践。

© www.soinside.com 2019 - 2024. All rights reserved.