python中的魔法屬性
阿新 • • 發佈:2018-12-30
目錄
- 1. __doc__
- 2. __module__ 和 __class__
- 3. __init__
- 4. __del__
- 5. __call__
- 6. __dict__
- 7. __str__
- 8. __getitem__、__setitem__、__delitem__
- 9. __getslice__、__setslice__、__delslice__
無論人或事物往往都有不按套路出牌的情況,Python的類屬性也是如此,存在著一些具有特殊含義的屬性,詳情如下:
1. __doc__
- 表示類的描述資訊
class Foo: """ 描述類資訊,這是用於看片的神奇 """ def func(self): pass print(Foo.__doc__) #輸出:類的描述資訊
2. __module__ 和 __class__
- __module__ 表示當前操作的物件在那個模組
- __class__ 表示當前操作的物件的類是什麼
test.py
# -*- coding:utf-8 -*-
class Person(object):
def __init__(self):
self.name = 'laowang'
main.py
from test import Person obj = Person() print(obj.__module__) # 輸出 test 即:輸出模組 print(obj.__class__) # 輸出 test.Person 即:輸出類
3. __init__
- 初始化方法,通過類建立物件時,自動觸發執行
class Person:
def __init__(self, name):
self.name = name
self.age = 18
obj = Person('laowang') # 自動執行類中的 __init__ 方法
4. __del__
- 當物件在記憶體中被釋放時,自動觸發執行。
注:此方法一般無須定義,因為Python是一門高階語言,程式設計師在使用時無需關心記憶體的分配和釋放,因為此工作都是交給Python直譯器來執行,所以,__del__的呼叫是由直譯器在進行垃圾回收時自動觸發執行的。
class Foo:
def __del__(self):
pass
5. __call__
- 物件後面加括號,觸發執行。
注:__init__方法的執行是由建立物件觸發的,即:物件 = 類名()
;而對於 __call__ 方法的執行是由物件後加括號觸發的,即:物件()
或者 類()()
class Foo:
def __init__(self):
pass
def __call__(self, *args, **kwargs):
print('__call__')
obj = Foo() # 執行 __init__
obj() # 執行 __call__
6. __dict__
- 類或物件中的所有屬性
類的例項屬性屬於物件;類中的類屬性和方法等屬於類,即:
class Province(object):
country = 'China'
def __init__(self, name, count):
self.name = name
self.count = count
def func(self, *args, **kwargs):
print('func')
# 獲取類的屬性,即:類屬性、方法、
print(Province.__dict__)
# 輸出:{'__dict__': <attribute '__dict__' of 'Province' objects>, '__module__': '__main__', 'country': 'China', '__doc__': None, '__weakref__': <attribute '__weakref__' of 'Province' objects>, 'func': <function Province.func at 0x101897950>, '__init__': <function Province.__init__ at 0x1018978c8>}
obj1 = Province('山東', 10000)
print(obj1.__dict__)
# 獲取 物件obj1 的屬性
# 輸出:{'count': 10000, 'name': '山東'}
obj2 = Province('山西', 20000)
print(obj2.__dict__)
# 獲取 物件obj1 的屬性
# 輸出:{'count': 20000, 'name': '山西'}
7. __str__
- 如果一個類中定義了__str__方法,那麼在列印 物件 時,預設輸出該方法的返回值。
class Foo:
def __str__(self):
return 'laowang'
obj = Foo()
print(obj)
# 輸出:laowang
8. __getitem__、__setitem__、__delitem__
- 用於索引操作,如字典。以上分別表示獲取、設定、刪除資料
# -*- coding:utf-8 -*-
class Foo(object):
def __getitem__(self, key):
print('__getitem__', key)
def __setitem__(self, key, value):
print('__setitem__', key, value)
def __delitem__(self, key):
print('__delitem__', key)
obj = Foo()
result = obj['k1'] # 自動觸發執行 __getitem__
obj['k2'] = 'laowang' # 自動觸發執行 __setitem__
del obj['k1'] # 自動觸發執行 __delitem__
9. __getslice__、__setslice__、__delslice__
- 該三個方法用於分片操作(python2中才有,python3中使用第8點),如:列表
# -*- coding:utf-8 -*-
class Foo(object):
def __getslice__(self, i, j):
print('__getslice__', i, j)
def __setslice__(self, i, j, sequence):
print('__setslice__', i, j)
def __delslice__(self, i, j):
print('__delslice__', i, j)
obj = Foo()
obj[-1:1] # 自動觸發執行 __getslice__
obj[0:1] = [11,22,33,44] # 自動觸發執行 __setslice__
del obj[0:2] # 自動觸發執行 __delslice__