我试图从pathlib中创建子类Path,但在实例化时由于以下错误而失败
from pathlib import Path
class Pl(Path):
def __init__(self, *pathsegments: str):
super().__init__(*pathsegments)
实例化时出错
AttributeError: type object 'Pl' has no attribute '_flavour'
更新:
我继承的WindowsPath
仍然不起作用
TypeError: object.__init__() takes exactly one argument (the instance to initialize)
我解决了。Mokey补丁是一条路要走
像这样定义函数
最快、最简单、最方便的解决方案,零缺点。Pycharm中的Autosuggest运行良好
更新:
我得到了解决方案(与linter和auto Suggester一起使用):
Path
是一个抽象类,实际上根据操作系统实例化为两个可能的子类:PosixPath
或WindowsPath
https://docs.python.org/3/library/pathlib.html
这个基类寻找一个内部(私有)类变量来确定它实际上是什么类型的对象,这个变量称为
_flavour
你有两个选择:
这是最好的选择,因为它将避免您处理未记录的库内部,并保证您的代码不会在库的不同版本上中断。
如果希望代码跨平台,则需要根据操作系统对类进行不同的定义李>
代码如下所示:
不建议这样做,因为您将使用未记录的元素,这些元素可能会随着库的任何更改而随时中断,但它将允许您直接从
Path
继承李>注意,如果您决定使用此方法,可能会出现其他问题
部分问题在于
Path
类在__new__
中实现了一些条件逻辑,这些逻辑实际上不适合子类化。具体而言:这会将从
Path(...)
返回的对象类型设置为PosixPath
或WindowsPath
,但仅设置为if cls is Path
,这对于Path
的子类来说永远不会为真这意味着在}*WindowsPath和
__new__
函数中,cls won't have the
{{*PosixPath
类),因为Pl
类没有_flavour
属性我认为您最好显式地将其他类中的一个子类化,例如
PosixPath
或WindowsPath
相关问题 更多 >
编程相关推荐