我是python的新手。正在扩展旧模块。到目前为止,它具有返回str
(阻塞shell命令的输出)的函数。现在,我需要该函数还能够返回一个对象,以便以后可以对它执行操作(检查输出是否为非阻塞shell命令)。因此,该函数现在返回我的类的实例,该类从str
继承来实现向后兼容性。问题是,但是,当将这样的对象传递给os.path.isdir时,即使字符串是有效路径,它始终返回False。
import os class ShellWrap(str): def __new__(cls, dummy_str_value, process_handle): return str.__new__(cls,"") def __init__(self, dummy_str_value, process_handle): self._ph = process_handle self._output_str = "" def wait_for_output(self): # for simplicity just do self._output_str = "/Users" def __str__(self): return str(self._output_str) def __repr__(self): return str(self._output_str) def __eq__(self,other): if (isinstance(other, str)): return other == str(self._output_str) else: return super().__eq__(self,other) >>> obj = ShellWrap("",None) >>> obj.wait_for_output() >>> print(type(obj)) ... <class '__main__.ShellWrap'> >>> print (ShellWrap.__mro__) ... <class '__main__.ShellWrap'> (<class '__main__.ShellWrap'>, <class 'str'>, <class 'object'>) >>> print(type(obj._output_str)) ... <class 'str'> >>> print(obj) ... /Users >>> print(obj._output_str) ... /Users >>> obj == "/Users" ... True
困扰我的是:
>>> print(os.path.isdir(obj)) ... False **<<-- This one puzzles me** print(os.path.isdir("/Users")) ... True
我试图添加PathLike继承,并实现了一个更好的选择,但并不占优势:
。但是哪个?class ShellWrap(str,PathLike): .... def __fspath__(self): return self._output_str
似乎还有一个我没有实现的dunder
但是,我确实在调试器中看到了一些奇怪的东西。当我将手表放在obj
上时-它表示它是str
类,但调试器显示的值不带引号(与其他“纯” str不同)。在调试器中手动在字符串中添加引号-使其起作用,但我想编辑字符串可能会创建一个新对象,这一次是纯str。
我想念什么?
Edit
:在意识到(请参见接受的答案)我尝试做的事情是不可能的之后,我决定挑战必须继承str
的决定。 所以现在我的课没有继承任何东西。它仅实现了__str__, __repr__ and __fspath__
,这似乎足够了!显然,只要存在str
继承-它就具有优先权,不会调用dunder,并且会欺骗某些库来获取str值的底层C存储。我是python的新手。正在扩展旧模块。到目前为止,它具有返回str(阻塞shell命令的输出)的函数。现在,我需要该函数还能够返回...