python中魔法方法

一、魔法方法:

                   在python中 有一些方法以两个下划线开头和结尾,这些方法会在合适的时机进行调用(解释器自行调用),我们把这一类方法称为魔法方法。

二、类中常用的魔法方法:

'''
    __new__()、__init__()、__del__()、__str__()、__repr__()
    __setattr__、__getattr__、__delattr__、__getattribute__
    __eq__、__ne__、__lt__、__gt__
'''
class Person(object):

    def __new__(cls,*args,**kwargs):
        '''
        1.该方法 为实例化对象时候第一个调用的方法,
        2.该方法 的返回值为对象实例则 调用构造方法__init__(),否则不调用构造方法
        '''
        print("__new__ 方法被调用...")

        return super().__new__(cls) #这里通过父类的 __new__方法 返回对象实例,因此这里会调用构造方法

    def __init__(self,name,age):
        '''
        该方法 用于构造对象,对象初始化
        '''
        self.name = name
        self.age = age
        print("__init__ 方法被调用...")
    
    def __del__(self):
        '''
        该方法 在销毁对象时候自动被调用
        '''
        print("__del__ 方法被调用...")

    def __str__(self):
        '''
        该方法  用于显示对象信息,当调用print 打印该对象时候,会调用该方法
        '''
        return "我叫:" + self.name + ", 今年" + str(self.age) + "岁了."

    def __repr__(self):
        '''
        该方法  用于显示对象信息,当调用print 打印该对象时候,会调用该方法,区别在于
        该方法是 给解释器 看的,__str__ 是给 人看的
        当重写 __str__ 后,print 打印对象 将 不会 调用 __repr__  一般这样写:
        重写 __str__ 后 __repr__ = __str__
        '''
        return "我叫:" + self.name + ", 今年" + str(self.age) + "岁了."

    def __bool__(self):
        '''
        该方法 调用 bool 时候 会自动调用:对象.bool
        '''
        return Ture if self.age > 18 False


    def __setattr__(self,key,value):
        '''
            该方法为 父类方法: 当属性被设置时候 自动调用
        '''
        if key not in ("name","age"):
            return 
        if key == "age" and value < 0:
            return ValueError()
        super(Person,self).__setattr__(key,value)

    def __getattr__(self,key):
        '''
        访问某个不存在的属性 调用
        '''
        return "not exit"

    def __delattr__(self,key):
        '''
        删除某个属性时候调用
        '''
        if key == "name":
            raise AttributeError()
        super().__delattr__(key)

    def __getattribute__(self,key):
        '''
           所有属性/方法调用都经过这里,属于类方法
        '''
        return super().__getattribute__(key)

    def __eq__(self,other):
        '''
            用于比较两个对象的是否相等 p1 == p2
        '''
        return self.name = other.name

    def __ne__(self,other):
        '''
            用于比较两个对象是否不等
        '''
        return self.age != other.age
    
    def __lt__(self,other):
        '''
            小于
        '''
        return self.age < other.age

    def __gt__(self,other):
        '''
            大于
        '''
        return self.age > other.age
        

三、容器中常用魔法方法

'''
    __setitem__、__getitem__、__delitem__、__len__、__iter__、__contains__、__reversed__
'''

class MyDict(object):
    '''
    使用列表模拟 字典数据结构
    '''

    def __init__(self):
        self.__keys = []
        self.__values = []
        self.__pos = 0

    def __setitem__(self,key,value):
        '''
            设置容器中元素的行为
        '''
        if key in self.keys:
            self.__values[self.keys.index(key)] = value
        else:
            self.__keys.append(key)
            self.__values.append(value)

    def __getitem__(self,key):
        '''
            获取元素行为
        '''
        if key in self.keys:
            return self.__keys[self.__keys.index(key)],self.__values[self.__keys.index(key)]

    def __len__(self):
        '''
            容器的长度
        '''
        return len(self.__keys)

    def __contains__(self,key):
        '''
            容器成员运算
        '''
        return key in self.__keys

    def __reversed__(self):
        '''
            容器翻转
        '''
        self.__keys.reverse()
        self.__values.reverse()

    def __iter__(self):
        '''
            遍历容器时候使用
        '''
        return self

    def __next__(self):

        '''
            遍历容器时候 __iter__ 返回值为 self 则要重写 __next__ 方法
                                 返回值为 iter(obj) obj为内置对象,则使用obj 对象的__next__ 方法
        '''
        if self.__pos > len(self.__keys) - 1:
            raise StopIterIteration()
        key = self.__keys[self.__pos]
        value = self.__values[self.__keys.index(key)]
        
        return key,value
    
    def __delitem__(self,key):
        '''
            删除 容器元素 时调用
        '''
        if key in self.__keys:
            del self.__values[self.__keys.index(key)]
            del self.__keys[self.__keys.index(key)]




    

四、可调用的对象

'''
    __call__
'''

class Person(object):

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __call__(self,name,age):
        self.name = name
        self.age = age


if __name__ == "__main__":
    
    p = Person("zhangsan",18)
    p("lisi",20) # 这里调用 __call__ 方法

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值