2017-03-21 43 views
1

讓我們說,我有下面的類:打開文件,而無需提供路徑直接

class FileName(object): 
def __init__(self,pathName): 
    self.pathName = pathName 

def __repr__(self): 
    return self.pathName 

someFile = FileName(r'c:\users\sarith\a.txt') 

現在我知道我可以使用os.stat(someFile.pathName)或使用該os.stat(str(someFile))文件的細節得到。有沒有一種方法可以通過我只需要做os.stat(someFile)來獲得詳細信息。更具體地說,我的意思是有一個函數可以覆蓋,當FileName的實例被諸如open之類的函數調用時,它會返回pathName屬性?可工作

+1

....爲什麼這樣的功能已經不屬於該類的一部分? –

+0

是的,像'getStat'方法或東西添加 – Jerfov2

+0

@ IgnacioVazquez-Abrams我認爲我的例子蓋過了我想問的東西。我想直接爲任何可能需要訪問文件路徑的操作提供實例作爲參數。現在,當我這樣做時,出現「TypeError:強制爲Unicode:需要字符串或緩衝區」錯誤。 –

回答

2

一種選擇是剛剛從str繼承:

In [5]: class FileName(str): 
    ...: def __init__(self,pathName): 
    ...: self.pathName = pathName 
    ...: 
    ...: def __repr__(self): 
    ...: return self.pathName 
    ...: 

In [6]: os.stat(FileName("./__init__.py")) 
Out[6]: posix.stat_result(st_mode=33188, st_ino=26082240, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=203, st_atime=1489773922, st_mtime=1487777486, st_ctime=1487777486) 

In [7]: os.stat("./__init__.py") 
Out[7]: posix.stat_result(st_mode=33188, st_ino=26082240, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=203, st_atime=1489773922, st_mtime=1487777486, st_ctime=1487777486) 
+0

當某些事情使用繼承的'str'結構並且有些事情正在使用您定義的'pathName'屬性時,這會非常快速地混淆。例如,如果你將'__init__'設置爲'self.pathName = pathName +'.txt'','open'或者'os.stat'這樣的東西就不會看到'.txt'。 – user2357112

2

這不是你所期望的存在之類的話,但很多這樣的功能,真正做到認識的__fspath__ method,至少在Python 3.6上:

class FileName(object): 
    def __init__(self, path): 
     self.path = path 
    def __fspath__(self): 
     return self.path 

# Actually works! 
os.stat(FileName('/whatever'))