Python高级编程 读书笔记: 8、 第4章_魔术方法

# -*- encoding: utf-8 -*-

import functools
import time

'''
8、 第4章_魔术方法

关键:
1 魔术方法
含义:用于重载操作符或者内置方法
定义:可以通过__语法定义
语法: 将下划线放到方法名称的两端
钩子: 在特定事件发生时,能够为响应事件而调用的代码,回调函数就是钩子的一种类型

2 可用的魔术方法
2.1 __init__方法
__init__方法没有创建新对象,创建新对象是__new__完成的。
__init__是为创建后的对象提供初始化数据。

2.2 __new__方法
在__init__方法之前执行,用于创建类的实例。
参数:创建实例所需要的类

2.3 __del__方法
在对象被销毁时被调用。
无论时直接删除对象还是垃圾回收器触发,都会调用__del__方法
 
2.4 __str__
含义: 在对象传递给str的构造函数时被调用
 
2.5 __unicode__
特点:在对象被传递给unicode构造函数时调用
如果格式化unicode对象时,遇到%s,优先使用__unicode__方法

2.6 __bool__
作用:判定对象是否为True或者False
python2中时__nonzero__方法

2.7 __int__
作用: 将对象转换为数字

2.8 __float__
作用: 将对象转换为浮点数

2.9 __complex__
作用: 将对象转换为复数

2.10 __eq__
作用: 判定两个对象使用 == 操作符号比较时被调用

2.11 __ne__
作用: 在使用!=操作符时使用

2.12 __lt__
作用: <

2.13 __gt__
作用: >

2.14 __le__
作用: <=

2.15 __ge__
作用: >=

3 操作符重载
3.1 二元操作符
对于每个操作符,有3种魔术方法
1) 普通方法: x+y 等提供与 x._add_(y),仅仅返回结果
2) 取反方法: 在第一个操作对象不提供传统方法并且操作对象类型不同时才调用,将操作符两边对象顺序交换
x+y如果x没有定义_add_方法,则调用y._radd_(x)
3) 即席方法: 在操作符即席修改第一个变量时被调用,例如(+=)
x+=y 等同于 x._iadd_(y)

3.2 除法
特点: 向下取整
python2中是__div__方法
python3中是__truediv__方法

3.3 一元操作符
+, - , ~
特点: 只接受一个位置参数self
分别与:
__pos__(与+匹配)
__neg__(与-匹配)
__invert_(与~匹配)
~x等同于x._invert_()

4 重载常见方法
4.1 __len__
作用: 描述对象的长度
参数: 接受位置参数,并返回整型值

4.2 __repr__
作用: 确定对象在Python交互式终端中的显示方式。
        也可以用于重构对象的Python表达式
        
4.3 __hash__
作用: 通过数字化表达式唯一标识对象
参数: 接受位置参数self,并返回整型值
特点: 对象提供了__hash__函数,通常返回该对象的id

4.4 __format__
作用: 根据Python的格式化规范来格式化不同种类的对象
参数: 接受两个位置参数,第一个是self,第二个是格式化规范的字符串

4.5 __instancecheck__
issubclass:检查一个类是否继承自另一个类

5 集合
5.1 __contains__
作用: 判断某个对象是否在一个集合中
参数: 接受参数self和needle,判断needle是否在集合中

5.2 __getitem__
作用: 进行键查找,基本表达式是hatstack[key]
参数: 接受两个参数self和key

5.3 __setitem__
作用: 设置集合中元素的值
参数: self, key, value

5.4 __delitem__
作用: 在使用del关键字时被调用

5.5 __getattr__
作用: 常规方式无法找到属性时才被调用
参数: self, key

5.6 __setattr__
作用: 赋值给一个对西那个时被调用,方法会一直被调用

5.7 __getattribute__
作用: 被无条件调用,只有当__getattribute__发生异常,才会调用__getattr__


参考:
Python高级编程

'''

class DelClass(object):

    def __del__(self):
        print "I want to be professional at python."


def useDel():
    DelClass()


class StrClass(object):
    def __str__(self):
        return "This is class: {value}".format(
            value=self.__class__.__name__)


def useStrMagicMethod():
    result = str(StrClass())
    print result


class Who(object):
    def __str__(self):
        return 'string'

    def __unicode__(self):
        return u'unicode'


def useUnicodeMagicMethod():
    info = u"This is %s" % (Who())
    print info
    info = "This is %s" % (Who())
    print info


class InvertString(object):
    def __init__(self, s):
        self.s = s

    def __str__(self):
        return self.s

    def __invert__(self):
        return self.s[::-1]


def useInvertMagicMethod():
    word = "I want to be professional at python."
    temp = InvertString(word)
    result = ~temp
    print result


def process():
    useDel()
    useStrMagicMethod()
    useUnicodeMagicMethod()
    useInvertMagicMethod()


if __name__ == "__main__":
    process() 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值