Python 面向物件 —— 特殊函式(setattr、getattr、hasattr)
阿新 • • 發佈:2019-01-01
類的成員中以
__
開頭和結尾的(__xx__
)為特殊函式,可以在外部直接訪問,當然最直接的以及設計這一語法糖的初衷還是採用其過載形式。
注:1. 一般介面是固定的,不要輕易更改;
- _call_:括號運算子過載;
0. _new_ vs. _init_
在呼叫物件的構造方法時,Python 會呼叫 _new_ 建立物件,單後呼叫_init_ 初始化屬性。
1. _repr_ vs. _str_
功能類似於 Java 類中的 toString() 方法;
一般 Python 會提供一個預設實現,比如,
return '<%s(%r)>' %(self.__class__, self.__dict__)
2. 邏輯運算
返回 boolean
- _lt_:
<
的過載 - _eq_:判等;
3. _add_ vs _radd_
返回物件例項;
obj + obj ⇒ _add_
integer + obj ⇒ _radd_
4. _setattr_ _getattr_ _delattr_
class Storage(dict): def __setattr__(self, key, value): self[key] = value # 重寫dict, 通過`.`賦值 def __getattr__(self, key): try: return self[key] except KeyError: return None def __delattr__(self, key): try: del self[key] except KeyError: return None def __call__(self, key): try: return self[key] except KeyError: return None
5. setattr、getattr、hasattr
setattr/getattr/hasattr 均非類的特殊函式,
- hasattr(object, name)
- getattr(object, name[,default])
- setattr(object, name, values)
使用:
class Person: def __init__(self, **params): for key, value in params.items(): setattr(self, key, value) >> p = Person(name='zhang', age='26') >> p.name 'zhang' >> p.age '26'