type()不可不知的事
別以為type()只是去偵測參數裏的型態而以. type()其實是整個Python的核心, 請先看一下底下的代碼
def fn(self, l=0): self.level=l Pokemon=type("Pokemon", (object,), dict(setLevel=fn)) p1=Pokemon() p1.setLevel(100) print(p1.level)
首先定義一個函數 fn, fn的參數多了一個self, 然後使用 type(類別名, 繼承的類別, 綁定的方法), 這就就會產生一個動態的Pokemon類別, 然後就可以開始操作這個類別了.
蝦米, 動態產生類別. 是的, type()其實主要的工作, 是動態產生類別. 那跟我們直接寫class有什麼不一樣
class Pokemon(object): def setLevel(self, l=0): self.level=l p1=Pokemon() p1.setLevel(100) print(p1.level)
是的, 二者一模一樣. 更甚者, 編譯器一看到class, 就會把它轉成type()來執行. 所以type才是主角, class只是方便我們來撰寫程式碼而以.
type的參數說明如下
類別名稱 : 為字串格式, 其實這裏寫 ”也可以
繼承類別 : (object, ), 使用tuple的語法寫成
綁定方法 : dict(setLevel=fn)
dir()
取得物件的所有屬性和方法, 可使用dir(), 它返回一個包含字串的list
print(dir("abc")) ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
由上可知, 要取得字串長度, 除了使用len(“abc”)之外, 還可以直接調用__len__()方法
所以當我們自已寫了一個類別, 比如 Pokemon, 若希望len(Pokemon)能列出level的話, 就可以實作__len__()方法
class Pokemon(object): def __init__(self, level): self.level=level def __len__(self): return self.level p1=Pokemon(20) print("p1 的level : %d" % len(p1)) 結果 : p1 的level : 20
其他屬性函數
有三個函數蠻有用的, 分別是getattr()、setattr()及hasattr()
hasattr(obj, 'x') #是否有'x'屬性 setattr(obj, 'y', 19) #設定'y' 屬性 getattr(obj, 'y') #取得'y'屬性 getattr(obj, 'y', 404) #取得'y'屬性, 若無此屬性, 傳回預設值404 fn=getattr(obj, 'pow') #取得pow函數 fn()