1.getattr__和__getattribute
# __getattr__就是在查找不到属性时调用
from datetime import date
class User:
def __init__(self, name, birthday):
self.name = name
self.birthday = birthday
def __getattr__(self, item):
return 'aaaaa'
# 较于上面的方法,优先级更高,查找属性最先进入此方法
def __getattribute__(self, item):
return 'bbbbb'
if __name__ == '__main__':
user = User("angle", date(year=2015, month=2, day=1))
print(user.age) # 无age属性,抛出AttributeError: 'User' object has no attribute 'age'
# 使用getattr魔法方法,打印aaaaa
2.getitem
class Test:
def __init__(self, a):
self.a = a
def __getitem__(self, item):
return self.a[item]
# 当实例对象做P[key]运算时,就会调用类中的__getitem__()方法。
# 实例对象的key不管是否存在都会调用类中的__getitem__()方法。而且返回值就是__getitem__()方法中规定的return值。
if __name__ == '__main__':
test = Test([1,2,3,4])
print(test[1])# 打印2
3.len
# 如果一个类表现得像一个list(序列),要获取有多少个元素,就得用 len() 函数。
# 要让 len() 函数工作正常,类必须提供一个特殊方法__len__(),它返回元素的个数。
class Company(object):
def __init__(self, a):
self.a = a
def __str__(self):
return ','.join(self.a)
def __len__(self):
return len(self.a)
x = Company(["aa", "bb"])
4.init__和__new
class Demo:
def __new__(cls, *args, **kwargs):
print('new')
return super().__new__(cls)# 调用父类的方法
def __init__(self, name):
print('init')
self.name = name
# new用来控制对象的生成过程,在对象生成之前
# init 用来完善对象
# 如果new方法不返回对象,则不会调用init函数
if __name__ == '__main__':
demo = Demo('小明')# 这样传参数,调用*args---->tuple,进入__new__方法中
demo2 = Demo(name="小芳")# 调用**kwargs ---->dict,进入__new__方法中
5.enter__和__exit
这两个魔法函数与with语句密切相关,她们属于上下文管理协议
#上下文管理器协议
class A:
def __enter__(self):
print("enter")
# 获取资源
return self
def __exit__(self, exc_type, exc_val, exc_tb):
# 释放资源
print("exit")
def do_something(self):
print("doing something")
def pri(self, name):
print(name)
# with语句是为了简化异常处理,使用with方法中必须有这两个魔法方法,否则报错
if __name__ == '__main__':
with A() as a:
a.pri("ddd")
评论列表
已有0条评论