python中的部分魔法方法

Python 2019-01-30 907

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

标签:Python

文章评论

评论列表

已有0条评论