类的成员中以
__
开头和结尾的(__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'