• 2015/8/28 Python基础(2):对象


    Python用对象模型来存储数据。构造任何类型的值都是一个对象。
    Python对象都有是三个特性:身份,类型和值

    身份是每个对象的唯一身份标识。任何对象都可以用内建函数id()来得到身份。如:

    >>> s = 1
    >>> id(s)
    38249176

    身份可以认为是该对象的地址。

    类型是数据以何种方式保存,可以进行怎样的操作,遵循怎样的规则。可以使用内建函数type()来查看。

    值就是对象的数据项。

    上面三个特性在对象创建时被赋值,除值以外其他特性都是只读。对象的类型是可以改变的,但对于初学者不建议这么做

    Python是用点标记法来访问属性的,属性包括对象的名字等等,最常用的属性是函数和方法,不过有一些也有数据属性。含有数据属性的对象包括(不限于):类、类实例、模块、复数和文件

    Python的标准类型有:数字、整型、布尔、长整型、浮点、复数、字符串、列表、元组和字典。同时还有如下内建类型:类型(对,类型本身是一种类型)、Null对象、文件、集合、函数/方法、模块、类。

    类型也是一种对象,因为对象的一系列固有行为和特性需要事先定义,我们用类型这种对象来保存这些信息。
    用内建函数type()可以得到特定对象的类型信息

    >>> type(7)
    <type 'int'>

    这里输出了<type 'int'>,其实并不是简单告诉这是一个整数这样的字符串,而是一个类型对象,这个对象会输出一个字符串来告诉你他是一个对象。我们可以这样测试它

    >>> type(type(7))

    如果这只是一个字符串,它会显示<type 'str'>如果是对象类型,它会显示<type 'type'>

    结果是

    >>> type(type(7))
    <type 'type'>

    None,Null对象

    这是一个特殊的类型,它只有一个值是None,类似于C的void,没有任何内建方法,没有有用的属性,布尔值总是False

    同时还有一些用类实现的内部类型,这里暂不赘述。

    标准类型运算符
    对象值的比较
    比较运算符来判断同类型的对象是否相等,返回True或False。运算符有== 、<= 、 >=。多个比较可以在同一行里进行,这一点和C不同。比较的顺序式从左到右

    >>> 3 < 4 < 5
    True
    >>> 3 < 5 < 4
    False

    大多数语言中会写成这种形式

    >>> 3 < 4 and 4 < 5
    True
    >>> 3 < 5 and 5 < 4
    False

    同时,可以用如下的写法,数学中一般不写

    >>> 3 < 5 > 4
    True

    对象身份的比较
    这是对值比较的补充,Python也支持对象本身的比较。
    用的是如下的语句

    a is b

    它是用于比较a、b两个变量是否是指向同样的对象的。和a == b不相同。

    a is b等价于
    id(a) == id(b)
    有如下的代码

    >>> foo1 = 2.0
    >>> foo2 = 1.0 + 1.0
    >>> foo1 == foo2
    True
    >>> foo1 is foo2
    False
    >>> foo1 = 2.0
    >>> foo2 = 2.0
    >>> foo1 is foo2
    False
    >>> foo2 = foo1
    >>> foo1 is foo2
    True
    >>> foo3 = 2
    >>> foo4 = 1 + 1
    >>> foo3 is foo4
    True

    这里可以看到foo1和foo2的值是相等的,但它们身份不相等。也就是说并不是来自同一个引用。说明在内部存储它们时,是各自创建了两个对象然后引用的。

    然后还能看到,当我同时给foo1和foo2赋值2.0后,它们并不相等。是创造了两个对象,只有将foo1直接赋值给foo2才能使它们指向同一个对象。
    从此可以理解Python内部的赋值方式,每一个值进行新对象创造再引用给变量。
    但是,如果是对整数,结果就不同。书里说明:
    整数对象和字符串对象是不可变对象,所以Python 会很高效的缓存它们。这会造成我们认为Python 应该创建新对象时,它却没有创建新对象的假象。
    也就是说,整型和浮点型出现不同的缘故是因为Python高效地缓存了它们。不过这个缓存是有范围的,一定要小心使用。


     

    标准类型内建函数
    函数 功能
    cmp(obj1, obj2)  比较 obj1 和 obj2, 根据比较结果返回整数 i:
           i < 0 if obj1 < obj2
           i > 0 if obj1 > obj2
           i == 0 if obj1 == obj2
    repr(obj) 或 `obj` 返回一个对象的字符串表示
    str(obj) 返回对象适合可读性好的字符串表示
    type(obj) 得到一个对象的类型,并返回相应的type 对象

     

    repr()返回的是一个对象的“官方”字符串表示, 也就是说绝大多数情况下可以通过求值运算(使用eval()内建函数)重新得到该对象,但str()则有所不同。str() 致力于生成一个对象的可读性好的字符串表示,它的返回结果通常无法用于eval()求值, 但很适合用于 print 语句输出。也就是说 repr() 输出对 Python 比较友好, 而str()的输出对人比较友好。虽然如此,很多情况下这三者的输出仍然都是完全一样的。所谓的对Python友好和对人友好将会在数值这一部分中提到。

    类型工厂函数
    Python2.2统一了类型和类,所有的类型也都是类,原来的内建转换函数如type(),int()都成了工厂函数,也就是说虽然看上去像函数,但实际上是类。调用时是生成了一个类型的实例。
    关于类部分,由于本人学习的C语言里没有过多涉及,等到学习到类部分再做笔记。

    存储模型里,
    有存储一个或多个值的标量/原子类型,如数值和字符串。
    有容器类型,如列表、元组、字典。
    因为Python没有char类型,所以字符串是一个自我包含的文字类型,不是C中和数组相同的情况。

    更新模型,
    对象创建后,可以更新值的是更新模型,不允许更改的是不可变对象。列表和字典是可变模型,数字、字符串、元组是不可变模型。
    这里面存在理解偏差,数值和字符串变量可换,但对象不可更新,每次变换是重新创造了对象。
    也就是说每次变换后id()的值都会发生变化。而字典和列表,改变值本身,id()始终不变。

    访问模型,
    这种分类是区分数据类型的首要类型。按照访问我们存储的数据的方式来分类。有三种访问方式:直接存取、顺序、映射。
    直接存取 数字
    顺序访问 字符串、列表、元组
    映射访问 字典
    直接存取不赘述,顺序访问的是序列类型,就是元素从0开始索引顺序访问,一次可以访问一个或者多个元素。
    映射类型类似序列类型的索引属性,但不适用地址偏移量取值,元素是无序存放的,通过一个唯一的key来访问。是键-值集合

    分类数据类型的原因一是,Python提供的高级数据,我们要将原始的类型和功能强大的扩展类型区分开,所以需要了解分类。二是帮助我们搞清每种类型的特点。
    通过不同方面来分类的原因是这些数据结构本身的关系是复杂的,需要我们多次分清晰脉络,让我们对类型了解更深。

    Python没有的类型
    char或byte。Python没有8位的整数。可以用长度为1的字符串替代。
    指针。Python帮助程序员管理内存,所以不用访问指针。通过id()得到的值很接近地址,但是不能操作,所以指针也就没有用。
    没有短整长整的区别,让程序员更专注于该干的事。
    也没有单双精度的浮点类型。让事情更简单。

  • 相关阅读:
    Django跨域问题
    DOM,jquery,vue
    from和modelform的用法和介绍
    元类的__call__和__new__方法的作用
    Django学习之路由分发和反向解析
    Django 自定义auth_user
    Django创建对象的create和save方法
    Flask--(登录注册)抽取视图函数
    Flask--(项目准备)--添加日志
    Flask--(项目准备)--框架搭建,配置文件抽取,业务逻辑抽取
  • 原文地址:https://www.cnblogs.com/SRL-Southern/p/4769357.html
Copyright © 2020-2023  润新知