1 需求
2 接口
3 示例
4 參考資料
在 Python 中,像?__name__
?這樣的雙下劃線屬性(也稱為 "dunder" 屬性,即 "double underscore" 的縮寫)是 Python 的特殊屬性或方法,它們為類、對象或模塊提供了特殊的行為或元數據。以下是一些常見的類似?__name__
?的特殊屬性和方法:
1. 模塊級特殊屬性
這些屬性通常在模塊層級使用,提供關于模塊的元信息:
-
__name__
當前模塊的名稱。如果是主程序,則值為?'__main__'
;如果是被導入的模塊,則為模塊名。if __name__ == '__main__':print("作為主程序運行") else:print(f"被導入為模塊: {__name__}")
-
__file__
當前模塊的文件路徑(如果是腳本),或編譯后的字節碼文件路徑(如?.pyc
?文件)。print(f"模塊文件路徑: {__file__}")
-
__doc__
模塊、類或函數的文檔字符串(docstring)。def add(a, b):"""返回兩個數的和"""return a + bprint(add.__doc__) # 輸出: "返回兩個數的和"
-
__package__
當前模塊所屬的包名稱(用于包內相對導入)。print(f"模塊所屬包: {__package__}")
-
__loader__
加載當前模塊的加載器對象。print(f"模塊加載器: {__loader__}")
2. 類和對象的特殊屬性
這些屬性用于類和對象的底層行為:
-
__class__
對象所屬的類。num = 42 print(num.__class__) # 輸出: <class 'int'>
-
__dict__
類或對象的屬性字典,包含所有可寫的屬性。class Person:def __init__(self, name):self.name = namep = Person("Alice") print(p.__dict__) # 輸出: {'name': 'Alice'}
-
__bases__
類的基類元組,用于查看繼承關系。class Animal: pass class Dog(Animal): passprint(Dog.__bases__) # 輸出: (<class '__main__.Animal'>,)
-
__mro__
類的方法解析順序(Method Resolution Order),用于多重繼承時確定方法調用路徑。class A: pass class B(A): pass class C(B): passprint(C.__mro__) # 輸出: (<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
3. 特殊方法(Magic Methods)
這些雙下劃線方法用于實現對象的特殊行為,如運算符重載、迭代等:
-
__init__(self, ...)
對象的初始化方法,在創建對象時自動調用。class Point:def __init__(self, x, y):self.x = xself.y = y
-
__str__(self)
對象的字符串表示,用于?print()
?和?str()
?函數。class Point:def __str__(self):return f"Point({self.x}, {self.y})"
-
__len__(self)
對象的長度,用于?len()
?函數。class MyList:def __init__(self, data):self.data = datadef __len__(self):return len(self.data)
-
__getitem__(self, key)
實現對象的索引訪問(如?obj[key]
)。class MyList:def __getitem__(self, index):return self.data[index]
-
__call__(self, ...)
使對象可以像函數一樣被調用。class Adder:def __call__(self, a, b):return a + badd = Adder() print(add(3, 4)) # 輸出: 7
4. 其他特殊屬性
-
__slots__
限制類實例可以添加的屬性,節省內存。class Person:__slots__ = ['name', 'age'] # 只允許添加 'name' 和 'age' 屬性
-
__all__
模塊中使用?from module import *
?時要導入的對象列表(需顯式定義)。__all__ = ['func1', 'Class1'] # 只導出 func1 和 Class1
-
__version__
模塊或包的版本號(通常由開發者自定義)。__version__ = '1.0.0'
如何查看對象的所有特殊屬性?
使用?dir()
?函數可以獲取對象的所有屬性和方法,包括特殊屬性。過濾出雙下劃線開頭和結尾的屬性即可:
def get_special_attrs(obj):return [attr for attr in dir(obj) if attr.startswith('__') and attr.endswith('__')]# 查看模塊的特殊屬性
import sys
print(get_special_attrs(sys))# 查看類的特殊屬性
class MyClass: pass
print(get_special_attrs(MyClass))# 查看對象的特殊屬性
obj = MyClass()
print(get_special_attrs(obj))
注意事項
- 不要隨意修改特殊屬性:這些屬性是 Python 的底層機制,修改它們可能導致意外行為。
- 按需實現特殊方法:特殊方法(如?
__str__
)用于增強對象的行為,但需謹慎使用。 - 避免與特殊屬性重名:自定義屬性和方法應避免使用雙下劃線開頭和結尾的名稱,以免與 Python 的特殊機制沖突。
通過了解這些特殊屬性和方法,可以更深入地理解 Python 的運行機制,并編寫出更具 Python 風格的代碼。