您的位置:首页 > 编程语言 > Python开发

菜鸟初学python入门进阶第二节:面向对象,python中的魔法函数

2020-06-01 11:44 225 查看

python魔法函数

  • 4.例子
  • 👴又来啦,没想🔪吧🛐🛐🛐

    上一篇的链接:菜鸟初学python入门进阶第一节:面向对象,python中一切皆对象

    1.什么是魔法函数?

    python中,以双下划线开头,双下划线结尾的函数名定义的函数是魔法函数。
    一般不要自己定义魔法函数,一般直接使用python给我们提供的魔法函数。
    例如:

    class shit(object):
    def __init__(self, shit_list):
    self.shit_list = shit_list
    print("class :shit")
    
    def __getitem__(self, item):
    return self.shit_list[item]
    
    s = shit(['red_shit', 'yellow_shit', 'brown_shit'])
    
    for shi in s:
    print(shi)

    输出:

    class :shit
    red_shit
    yellow_shit
    brown_shit
    >>>

    init函数是一个魔法函数,它在实例化类时传入参数并执行。
    getitem函数也是一个魔法函数,它将shit类变成了一个可以迭代的类型(添加了“可以迭代”这样一个属性)
    如果没有加getitem,实例化之后必须要指定具体可迭代的对象,才能迭代

    s_1 = s.shit_list
    for shi in s_1:
    print(shi)

    要注意type类型是不可迭代的,所以class必须要实例化出对象之后才可以对对象进行迭代操作

    shit(['red_shit', 'yellow_shit', 'brown_shit'])
    for shi in shit:
    print(shi)

    输出:

    class :shit
    Traceback (most recent call last):
    File "D:\python\python3\t.py", line 50, in <module>
    for shi in shit:
    TypeError: 'type' object is not iterable
    >>>

    魔法函数有很多。
    python的任何一个类都可以用任意一个魔法函数来添加特性
    魔法函数并不是object类的方法。(类内定义的函数是方法)

    魔法函数是为了增强类的特性存在的。

    2.python的数据类型以及数据类型对python的影响

    实际上,魔法函数是python数据类型引申出的概念。
    魔法函数和继承没有关系
    魔法函数可以影响python对象的用法(写法)

    s = shit(['red_shit', 'yellow_shit', 'brown_shit'])
    s_2 = s[:2]
    for shi in s_2:
    print(shi)

    输出

    class :shit
    red_shit
    yellow_shit
    >>> 片

    可以看到,我们可以对一个类的实例进行切片操作,并迭代输出,说明getitem不仅给shit类增加了迭代类型的特性,还增加了序列类型的特性。
    我们可以用序列类型的语法来操作类shit的实例。
    当然,getitem还增加了序列类型的魔法函数,我们可以进行len()操作等待
    (len也是一个魔法函数)

    3.魔法函数一览

    ☀主要有
    :数学运算
    :非数学运算

    自行百度即可

    例子:

    class shit(object):
    def __init__(self, shit_list):
    self.shit_list = shit_list
    print("class :shit")
    
    def __getitem__(self, item):
    return self.shit_list[item]
    
    s = shit(['red_shit', 'yellow_shit', 'brown_shit'])
    print(s)

    输出:

    class :shit
    <__main__.shit object at 0x0000020AFA55E708>
    >>>

    print其实隐含调用了str这个魔法函数,这个魔法函数可以自己重写

    class shit(object):
    def __init__(self, shit_list):
    self.shit_list = shit_list
    print("class :shit")
    def __getitem__(self, item):
    return self.shit_list[item]
    
    def __str__(self):
    return '--'.join(self.shit_list)
    
    s = shit(['red_shit', 'yellow_shit', 'brown_shit'])
    print(s)

    输出:

    class :shit
    red_shit--yellow_shit--brown_shit
    >>>

    repr魔法函数:
    这个输出只有开发人员才看得到

    4.例子

    len函数的特殊性:

    len函数对于python原生的数据结构(list、set、dict)是效率很高的(用c语言实现的)

    for循环内部实现了许多功能,其会寻找一个迭代器,如果类内部没有定义魔法函数iter,则其会去寻找魔法函数getitem


    就到这里🔥🔥🔥

    下一篇的链接:菜鸟初学python入门进阶第三节:面向对象,深入类与对象


    U•ェ•*U-U•ェ•*U-U•ェ•*U-U•ェ•*U-U•ェ•*U-U•ェ•*U-U•ェ•*UU•ェ•*U-U•ェ•*U-U•ェ•*U-U•ェ•*U-U•ェ•*U-U•ェ•*U-

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: