你有很多有用的方法,想使用它們來擴充套件其他類的功能。但是這些類並沒有任何繼承的關係。 因此你不能簡單的將這些方法放入乙個基類,然後被其他類繼承。
假設你想擴充套件對映物件,給它們新增日誌、唯一性設定、型別檢查等等功能。下面是一些混入類:
from collections import defaultdict
class log:
__slots__ = ()
def __getitem__(self, key):
print("get" + str(key))
return super().__getitem__(key)
def __setitem__(self, key, value):
print("set" + str(key))
return super().__setitem__(key, value)
def __delitem__(self, key):
print("del" + str(key))
return super().__delitem__(key)
'''only allow a key to be set once.
'''__slots__ = ()
def __setitem__(self, key, value):
if key in self:
raise keyerror(str(key) + ' already set')
return super().__setitem__(key, value)
'''restrict keys to strings only
'''__slots__ = ()
def __setitem__(self, key, value):
if not isinstance(key, str):
raise typeerror('keys must be strings')
return super().__setitem__(key, value)
class loggeddict(log, dict):
pass
pass
d = loggeddict()
d['x'] = 23
print(d['x'])
d = setoncedefaultdict(list)
print(d['x'])
d['x']=23#keyerror: 'x already set'
這個例子中,可以看到混入類跟其他已存在的類(比如dict、defaultdict和ordereddict)結合起來使用,乙個接乙個。 結合後就能發揮正常功效了。
對於混入類,有幾點需要記住。首先是,混入類不能直接被例項化使用。 其次,混入類沒有自己的狀態資訊,也就是說它們並沒有定義__init__()
方法,並且沒有例項屬性。 這也是為什麼我們在上面明確定義了__slots__ = ()
。
還有一種實現混入類的方式就是使用類裝飾器,如下所示:
from collections import defaultdict
def log(cls):
cls_getitem = cls.__getitem__
cls_setitem = cls.__setitem__
cls_delitem = cls.__delitem__
def __getitem__(self, key):
print("get" + str(key))
return cls_getitem(self,key)
def __setitem__(self, key, value):
print("set" + str(key))
return cls_setitem(self,key, value)
def __delitem__(self, key):
print("del" + str(key))
return cls_delitem(self,key)
cls.__getitem__ = __getitem__
cls.__setitem__ = __setitem__
cls.__delitem__ = __delitem__
return cls
@log
class loggeddict(dict):
pass
d = loggeddict()
d['x'] = 23
print(d['x'])
Java String類擴充套件功能實現
string類擴充套件功能實現 public class strings else string str1 newstring a return str1 將已有字串填充為規定長度,如果已有字串超過這個長度則返回這個字串 字元填充於字串前 例如 abc a 5 aaabc abc a 3 abc p...
String類擴充套件功能實現
string類擴充套件功能實現 public class strings char data new char count for int i 0 i aaabc abc a 3 abc param str 被填充的字串 param filledchar 填充的字元 param len 填充長度 r...
C 類擴充套件方法
擴充套件方法使你能夠向現有型別 新增 方法,而無需建立新的派生型別 重新編譯或以其他方式修改原始型別。擴充套件方法是一種特殊的靜態方法,但可以像擴充套件型別上的例項方法一樣進行呼叫下面以乙個 例子說明 定義乙個npc 類 定義 npc 類 public class npc 定義字段變數對應的屬性 p...