類擴充套件功能的方法

2021-09-20 09:38:04 字數 2283 閱讀 1817

你有很多有用的方法,想使用它們來擴充套件其他類的功能。但是這些類並沒有任何繼承的關係。 因此你不能簡單的將這些方法放入乙個基類,然後被其他類繼承。

假設你想擴充套件對映物件,給它們新增日誌、唯一性設定、型別檢查等等功能。下面是一些混入類:

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...