物件屬性

      在〈物件屬性〉中尚無留言

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()

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *