gpt4 book ai didi

python - 如何对具有 __new__ 并依赖于 cls 值的类进行子类化?

转载 作者:太空狗 更新时间:2023-10-30 00:10:28 25 4
gpt4 key购买 nike

我的具体用例是我正在尝试继承 pathlib.Path。我希望能够添加或覆盖一些功能,但我也想继承所有 Path。路径有一个 __new__ 并且其中有:

if cls is Path:
cls = WindowsPath if os.name == 'nt' else PosixPath

换句话说,Path 需要将适当的类传递给它。问题是我不知道如何创建我的类并使用 cls == Path 调用 Path.__new__

我尝试了很多东西,每一个都给我带来了不同的问题。这给了我 AttributeError: type object 'RPath' has no attribute '_flavour' 因为我试图覆盖父类。

Python3:

class RPath(Path):
def __new__(cls, basedir, *args, **kwargs):
return Path.__new__(cls, *args, **kwargs)

def __init__(self, basedir, *pathsegs):
super().__init__()
self.basedir = basedir

def newfunction(self):
print('Something new')

而这个返回一个 Path 对象,因此不允许我进行覆盖。

def __new__(cls, basedir, *args, **kwargs):
return Path.__new__(Path, *args, **kwargs)

我还尝试了 super() 的各种用法,但无济于事。

这看起来应该很简单。我错过了什么?

更新:我想要完成什么?具体来说,我想制作 class RPath(basedir, *pathsegments):

rpath=RPath('\root\dir', 'relpath\path2\file.ext)
assert rpath.basedir == '\root\dir' # True
rpath.rebase('\new_basedir')
assert rpath.basedir === '\newbasedir' # True
# And while I'm at it
assert rpath.str == str(rpath) # make str a property == __str__(self)

最佳答案

我认为这不可能以通常的方式实现。但即使你能做到,它也行不通,因为 Path 所做的也不是返回一个普通的 Path,而是返回一些子类(WindowsPath 或 PosixPath)。所以你对 Path 的覆盖不会生效,因为如果你能够继承 Path.__new__,它仍然会返回,比如说,WindowsPath,并且 WindowsPath 继承自 Path,而不是你的自定义路径子类.

pathlib.Path 似乎有一个特殊的类结构,您必须做一些特殊的工作才能复制它。乍一看,您需要创建自己的 WindowsPath 和 PosixPath 子类,然后创建一个 Path 子类来委托(delegate)实例化其中一个而不是自身。

关于python - 如何对具有 __new__ 并依赖于 cls 值的类进行子类化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30924011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com