• Python Study (01) 之 特殊方法


    Python深入:特殊方法和多范式

    Python是一切皆对象,意思就是python的天生就是个“纯面向对象语言”呀。
    但是!!!
    Python还是一个多范式语言(multi-paradigm),即你不仅可以使用面向对象的方式来编写程序,还可以用面向过程的方式来编写相同功能的程序(当然还有函数式编程,java8也支持)。Python的多范式依赖于Python对象中的特殊方法(special method)。

    特殊方法

    特殊方法又被成为魔术方法(magic method,特殊方法就是方法名的前后各有两个下划线。
    形如:__funcName__()

    比如:当对象中定义了特殊方法的时候,Python也会对它们有“特殊优待”。比如定义了init()方法的类,会在创建对象的时候自动执行__init__( )方法中的语句完成对象创造。

    可以通过dir()来查看对象所拥有的特殊方法。
    - 比如int对象,就是dir(1)或者dir(int)
    - 比如str对象,就是dir(“hello”)或者dir(str)

    Python运算符的本质

    :Python的运算符本质是通过调用对象的魔术方法实现的。
    [Demo]:
    ‘hello’+’word’ #字符串的拼接,注意是new了一个新的return,之前的”hello”和”word”已经成了内存垃圾,等待GC清理
    字符串拼接的本质实现呢?
    ‘hello’.__add__(‘word’) 也就是+号在str操作其实就是调用了这个特殊的方法!!
    所以’hello’+’word’完全可以写成’hello’.__add__(‘word’)。

    所以,在Python中,两个对象是否能进行加法运算,首先就要看相应的对象是否有定义__add__()方法。一旦相应的对象有定义__add__()方法,即使这个对象从数学概念上不可加,我们都可以用加法的形式,来表达obj.__add__()所定义的操作。在Python中,运算符起到简化书写的功能,但它依本质底层是靠特殊方法实现。 Python不强制用户使用面向对象的编程方法。用户可以选择自己喜欢的使用方式(比如选择使用+符号,还是使用更加面向对象的习惯使用__add__()方法)。
    {More examples}
    int.abs(-3) 等价 -(-3)
    int.float(2) 等价 float(3)
    a = 2
    a.add(3) 等价 2+3
    (1.8).mul(2.0) 等价 1.8*2.0
    True.or(False) 等价 True or False
    True.and(False) 等价 True and False

    内置函数

    内置函数与运算符类似,许多py内置函数也都是调用具体的对象的特殊方法。比如
    len([1,2,3]) # 返回list对象中元素的总数
    实际上做的是
    [1,2,3].len() 相对与__len__(),内置函数len()也起到了简化书写的作用。
    例如
    (-1).__abs__()
    (2.3).__int__()

    java 也有,比如toString() equals()方法等,但是操作都是面向对象的方法涉及。

    list对象的元素

    常见的表元素引用方式

    li = [1, 2, 3, 4, 5, 6]
    print(li[3])

    上面的程序运行到li[3]的时候,Python发现并理解[]符号,然后调用__getitem__()方法。
    li = [1, 2, 3, 4, 5, 6]
    print(li.__getitem__(3)) #getitem就是获取下标元素的意思
    {更多的操作:}
    li.__setitem__(3, 100) 等价就是li[3]=100
    li.__delitem__(2) 等价就是del li[2]
    如果是dict
    c={‘a’:1, ‘b’:2}
    c.__delitem__(‘a’)
    print(c)

    函数

    在Python中,函数也是一种对象。实际上,任何一个有__call__()特殊方法的对象都被当作是函数。__call__是使这个实例属性变成一个方法并调用

    class Obj2func(object):  #我们把这个类的对象变成一个方法对象
        def __call__(self, a):  #函数对象处理的似乎就是调用这个方法。
            return a + 5    #a+5的本质是a.__add__(5)哦
    
    demo = Obj2func()     # A function object
    print(demo(2))          # Call function    
    res = list(demo, [2, 4, 5])    # Pass around function object
    for i in res:
        print(i,end=" ")  #结尾变成空格隔开

    **
    1。demo是obj2fucn类的一个对象,当demo对象被操作似乎,首先触发调用__call__()
    即demo执行加5的操作然后放回。
    2。demo还可以作为函数对象,作为一个type(demo)等于

    总结

    对于内置的对象来说(比如整数、list、字符串等),它们本身所需要的特殊方法都已经在Python中人家早早的准备好了。Python的许多语法都是基于其面向对象模型的封装。对象模型是Python的骨架,是功能完备、火力强大的大黄蜂。但是Python也提供更加简洁的语法,让你使用不同的编程形态,从而在必要时隐藏一些面向对象的接口。
    但是用户自己定义的对象是没有滴,你也可以通过增加特殊方法,来实现自定义的语法。简化你得对象的操作语法。当然直接封装为函数其实可读性更好吧

  • 相关阅读:
    python ConfigParser、shutil、subprocess、ElementTree模块简解
    python中getattr函数 hasattr函数
    对简历的一点看法
    信息过载下的时间管理
    沉默的QQ
    想把余生变诗篇
    你的薪水偏高了吗?
    写给三十五岁的自己
    传统企业对互联网的痴心妄想
    小二,换大碗!
  • 原文地址:https://www.cnblogs.com/itrena/p/7434091.html
Copyright © 2020-2023  润新知