Python高级知识点学习(一)

作者: kakarotto | 来源:发表于2018-10-16 18:18 被阅读3532次
    image.png

    Python中一切皆对象

    和Java相比,Python的面向对象更加彻底。
    函数和类也是对象,是python的一等公民。
    代码和模块也可以称之为对象。
    python中的类也是对象,类可以理解为模板,根据这个模板去生成我们的对象,可以动态修改类的属性。
    何为一等公民?

    1. 可以赋值给一个变量
    2. 可以添加到集合对象中
    3. 可以作为参数传递给函数
    4. 可以当做函数的返回值 (生成器应用)

    type、object、class之间的关系

    类是由type来生成的一个对象,object是所有类都要继承的最顶层的一个基础类,type也是一个类,同时也是一个对象。
    看代码片段一:

    a = 1
    b = "abc"
    print(type(1))
    print(type(int))
    print(type(b))
    print(type(str))
    
    打印出的结果:
    <class 'int'>
    <class 'type'>
    <class 'str'>
    <class 'type'>
    

    代码片段二:

    class Student:
        pass
    
    
    class MyStudent(Student):
        pass
    
    
    stu = Student()
    
    print(type(stu))
    print(type(Student))
    print(int.__bases__)
    print(str.__bases__)
    print(Student.__bases__)# 打印Student基类
    print(MyStudent.__bases__)# 打印Student基类
    print(type.__bases__)
    print(object.__bases__) # 最顶层的类的基类为空
    print(type(object))
    
    打印出的结果:
    <class '__main__.Student'>
    <class 'type'>
    (<class 'object'>,)
    (<class 'object'>,)
    (<class 'object'>,)
    (<class '__main__.Student'>,)
    (<class 'object'>,)
    ()
    <class 'type'>
    

    可以看到,类是由type来生成的一个对象。
    上述代码建议反复阅读练习。

    Python中常见的内置类型

    首先说明对象的三个特征:

    1. 身份:也就是地址,通过id()函数查看地址
    2. 类型:int、str等
    3. 值:每个对象都有自己的值

    常见内置类型:

    • None(全局只有一个),Python解释器在启动时会用None生成一个None对象。
    a = None
    b = None
    print(id(a) == id(b))
    
    打印结果:
    Ture
    

    可以看到a,b是指向同一个对象(id相同)。

    • 数值类型:int float complex(复数) bool。
    • 迭代类型:可用for进行遍历
    • 序列类型:list、bytes、range、tuple、str、array 等
    • 映射类型:dict
    • 集合类型:set、frozenset
    • 上下文管理器:with语句
    • 其他:class、实例 等等等。

    Python中的魔法函数

    问:什么是魔法函数?
    答:双下划线开头,双下划线结尾的这些函数,通常称之为魔法函数。
    例如:


    image.png

    一般魔法函数不要自定义,使用 Python 提供的即可。

    使用 Python 提供的魔法函数,为了增强类的特性。

    代码:使用魔法函数之前

    class Company(object):
        def __init__(self, employee_list):
            self.employee = employee_list
    
    company = Company(["tom", "bob", "jane"])
    for i in company.employee:
        print(i)
    
    打印结果:
    a
    b
    c
    

    代码:使用魔法函数之后

    class Company(object):
        def __init__(self, employee_list):
            self.employee = employee_list
    
        def __getitem__(self, item):
            return self.employee[item]
    
    company = Company(["a", "b", "c"])
    
    打印结果:
    a
    b
    c
    

    可以看到__getitem__()这个魔法函数的功能。

    定义了这个魔法函数后,实例化后的对象就隐含的变为可迭代对象(iterable)。

    for循环其实是要拿到一个对象的迭代器,迭代器是需要实现__iter__这个方法才会有迭代器特性,Python语法会做一些优化,如果拿不到迭代器,就会尝试去对象中找__getitem__这个方法,如果有的话就会调用这个方法,一次一次直到将数据取完。这是python语言本身解释器会完成的功能。

    魔法函数调用不需要显示调用,解释器会隐式调用。

    Python的数据模型

    魔法函数是Python数据模型的一个概念而已,因为网络上大家喜欢称之为魔法函数。
    Python数据模型会增强对象的特性。

    class Company(object):
        def __init__(self, employee_list):
            self.employee = employee_list
    
        def __getitem__(self, item):
            return self.employee[item]
    
        def __len__(self):
            return len(self.employee)
    
    company = Company(["a", "b", "c"])
    
    print(len(company))
    结果:
    3
    

    __len__魔法函数增强了company对象的特性。

    因为魔法函数很多,类似的魔法函数请大家自行去网上查找,并查看用法。

    相关文章

      网友评论

        本文标题:Python高级知识点学习(一)

        本文链接:https://www.haomeiwen.com/subject/bvqfzftx.html