特殊属性:
_slots__限定类,不能自由添加属性
_metaclass:用特定方式来创建类
def upper_attr(future_class_name,future_class_parents,future_class_attr):
newAttr = {}
for name,value in future_class_attr.items():
if not name.startswith("__"):
newAttr[name.upper()] = value
return type(future_class_name,future_class_parents,newAttr)
class Foo(object):
__metaclass__ = upper_attr
bar = 'bip'
print(hasattr(Foo,'bar')) #True
print(hasattr(Foo,'BAR')) #False
特殊方法
_new_
_init_
_del_
_str_: 当直接调用对象名时会调用此方法
_call_:将对象名当成方法名调用时会调用此方法
_getattr_: 当调用一个不存在的属性时,会调用此方法
_getattribute_:属性和方法访问拦截器
class Test(object):
def __init__(self,subject1):
self.subject1 = subject1
self.subject2 = "app"
def __getattribute__(self,obj):
if obj == "subject1":
print("log subject1")
return 'redirect python'
else:
return object.__getattribute__(self,obj)
s = Test('python')
print(s.subject1)
print(s.subject2)
输出为:
log subject1
redirect python
app
注意在对象调用方法时,实际分了两步,先将方法名的字符串传入__getattribute__中,得到一个返回值(应该是一个方法),再结果()调用这个方法。
内嵌函数
python3中range是生成一个生成器,python2中是生成一个列表
map方法传入一个方法和一个或多个可迭代对象(由方法参数个数决定),返回一个迭代器
filter方法:filter(func,sequence):func 返回bool类型的方法,sequence一个可迭代对象,返回func为True的sequence中的参数组成的迭代器。
functools:
reduce函数:
partial函数:
wraps函数: