Python编程基础之三对象

2023-11-16

一、简介

       Python使用对象模型来存储数据,构造任何类型的值都是一个对象。再加上内建类型、标准类型运算符和内建函数,有助于更好的理解Python是如何工作的。

二、详解

1、Python的对象

       所有的 Python 对像都拥有三个特性:身份、类型和值。
身份:每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数 id()来得到。这个值可以被认为是该对象的内存地址。
类型:对象的类型决定了该对象可以保存什么类型的值,可以进行什么样的操作,以及遵循什么样的规则。您可以用内建函数 type()查看 Python对象的类型。因为在 Python 中类型也是对象,所以 type()返回的是对象而不是简单的字符串。
值:对象表示的数据项。

       上面三个特性在对象创建的时候就被赋值,除了值之外,其它两个特性都是只读的。如果对象支持更新操作,那么它的值就可以改变,否则它的值也是只读的。对象的值是否可以更改被称为对象的可改变性(mutability)。只要一个对象还没有被销毁, 这些特性就一直存在。
        Python有一系列的基本(内建)数据类型,必要时也可以创建自定义类型来满足你的应用程序的需求。绝大多数应用程序通常使用标准类型,对特定的数据存储则通过创建和实例化类来实现。
        某些 Python对象有属性、值或相关联的可执行代码,比如方法(method)。Python用句点(.)标记法来访问属性。属性包括相应对象的名字等等,最常用的属性是函数和方法,不过有一些Python类型也有数据属性。含有数据属性的对象包括(但不限于):类、类实例、模块、复数和文件。

2、Python的标准类型

       标准类型也称作“基本数据类型”,这些类型是Python内建的基本数据类型,包括:数字(分为几个子类型,其中有三个是整型)、整型、布尔型、长整型、浮点型、复数型、字符串、列表、元组、字典。

3、Python的其他内建类型

       Python开发时可能会用到的一些数据类型,包括:类型、Null对象 (None)、文件、集合/固定集合、函数/方法、模块、类。
(1)类型对象和type类型对象

        对象的一系列固有行为和特性(比如支持哪些运算,具有哪些方法)必须事先定义好。从这个角度看,类型正是保存这些信息的最佳位置。描述一种类型所需要的信息不可能用一个字符串来搞定,所以类型不能是一个简单的字符串,这些信息不能也不应该和数据保存在一起,所以我们将类型定义成对象。
       通过调用内建函数 type()能够得到特定对象的类型信息:

>>> type(42)
<type 'int'>
        <type 'int'> 并不是一个简简单单的显示42是个 整数,实际上是一个类型对象,它输出了一个字符串说明它是个 int 型对象。
>>> type(type(42))
<type 'type'>
        所有类型对象的类型都是type,它也是所有 Python 类型的根和所 Python标准类的默认元类(metaclass)。
         随着Python 2.2中类型和类的统一,类型对象在面向对象编程和日常对象使用中扮演着更加重要的角色。从现在起,类就是类型,实例是对应类型的对象。

(2)None,Python的Null对象

        Python有一个特殊的类型,被称作Null对象或者NoneType,它只有一个值,那就是 None。它不支持任何运算也没有任何内建方法。如果非常熟悉 C 语言,和None类型最接近的C类型就是void,None类型的值和C 的 NULL 值非常相似。
        None 没有什么有用的属性,它的布尔值总是 False。
        布尔值:所有标准对象均可用于布尔测试,同类型的对象之间可以比较大小。每个对象天生具有布尔True或False值。空对象、值为零的任何数字或者Null对象None的布尔值都是False。布尔值是False的对象有:None、False (布尔类型)、所有的值为零的数、0 (整型)、0.0(浮点型)、0L (长整型)、0.0+0.0j (复数)、"" (空字符串)、[] (空列表)、() (空元组)、{} (空字典)。值不是列出来的任何值的对象的布尔值都是True,例如non-empty、non-zero等等。用户创建的类实例如果定义了nonzero(__nonzero__())或length(__len__())且值为0,那么它们的布尔值就是False。

4、Python的内部类型

一般的程序员通常不会直接和 内部类型对象打交道,它包括代码、帧、跟踪记录、切片、省略、Xrange。

5、Python的标准类型运算符

(1)对象值的比较

       比较运算符用来判断同类型对象是否相等,所有的内建类型均支持比较运算,比较运算返回布尔值True或False。注意,实际进行的比较运算因类型而异。换言之,数字类型根据数值的大小和符号比较,字符串按照字符序列值进行比较等。

>>> 1 == 2
False
>>> 'abc' < 'xyz'
True
>>> 3 < 4 < 7 # same as ( 3 < 4 ) and ( 4 < 7 )
True
不同于很多其它语言,多个比较操作可以在同一行上进行,求值顺序为从左到右。
(2)对象身份比较

        作为对值比较的补充,Python也支持对象本身的比较。对象可以被赋值到另一个变量(通过引用)。因为每个变量都指向同一个(共享的)数据对象,只要任何一个引用发生改变,该对象的其它引用也会随之改变。

        例1:foo1 和 foo2 指向相同的对象,foo1 = foo2 = 4.3(或foo1 = 4.3;foo2 = foo1)


它表现的只是一个多重赋值,将4.3这个值赋给了foo1和foo2这两个变量。 事实是一个值为4.3的数字对象被创建,然后这个对象的引用被赋值给foo1和foo2,结果就是foo1和foo2指向同一个对象。
       例2:foo1和 foo2指向不同的对象,foo1 = 4.3;foo2 = 1.3 + 3.0


       这个例子有所不同。首先一个数字对象被创建,然后赋值给foo1。 然后第二个数值对象被创建并赋值给 foo2。尽管两个对象保存的是同样大小的值,但事实上系统中保存的都是两个独立的对象,其中 foo1 是第一个对象的引用,foo2 则是第二个对象的引用。对象就像一个装着内容的盒子,每当这个对象有了一个新的引用,就会在盒子上新贴一张标签。当一个引用被销毁时,这个标签就会被撕掉。当所有的标签都被撕掉时, 这个盒子就会被回收。Python是怎么知道这个盒子有多少个标签呢?因为每个对象都天生具有一个计数器,记录它自己的引用次数,这个数目表示有多少个变量指向该对象。

         Python 提供了is和is not运算符来测试两个变量是否指向同一个对象(is与not标识符都是Python关键字)。a is b这个表达式等价于id(a) == id(b)。标准类型对象身份比较运算符,obj1 is obj2obj1 和 obj2 是同一个对象obj1 is not obj2:obj1 和 obj2 不是同一个对象。

(3)布尔类型

       标准类型布尔运算符,not expr:expr的逻辑非 (否);expr1 and expr2:expr1和expr2的逻辑与;expr1 or expr2:expr1和expr2的逻辑或。and,or和not都是Python关键字,这些运算符的优先级按从高到低是not、and、or。

6、Python的标准类型内建函数

Python 提供了一些内建函数用于基本对象类型:cmp()、 repr()、str()、type(),和等同于repr()函数的单反引号(``) 运算符。

函数                          功能
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 对象
(1)cmp()

        内建函数 cmp()用于比较两个对象,类似于C语言的 strcmp()函数,比较是在对象之间进行的,不管是标准类型对象还是用户自定义对象。如果是用户自定义对象, cmp()会调用该类的特殊方法__cmp__()。

>>> a, b = 2, 8
>>> cmp(a, b)
-1
>>> cmp(b, a)
1
(2)str()和repr() (及 `` 运算符)

        内建函数 str() 和 repr() 或反引号运算符(``) 可以方便的以字符串的方式获取对象的内容、类型、数值属性等信息。str()函数得到的字符串可读性好,而 repr()函数得到的字符串通常可以用来重新获得该对象,通常情况下 obj == eval(repr(obj)) 这个等式是成立的。这两个函数接受一个对象做为其参数, 返回适当的字符串。

>>> str(2e10)
'20000000000.0'
>>> repr(2e10)
'20000000000.0'
>>> `2e10`
'20000000000.0'
        尽管 str()、repr()和``运算在特性和功能方面都非常相似,事实上 repr() 和 `` 做的是完全一样的事情,它们返回的是一个对象的“官方”字符串表示,也就是说绝大多数情况下可以通过求值运算(使用 eval()内建函数)重新得到该对象,但 str()则有所不同,str() 致力于生成一个对象的可读性好的字符串表示,它的返回结果通常无法用于 eval()求值,但很适合用于 print 语句输出。
(3)type()和isinstance()

        type() 接受一个对象做为参数,并返回它的类型,它的返回值是一个类型对象,其输出会以一个相对标准的格式表示这个对象,格式通常是这种形式: <object_something_or_another>,以这种形式显示的对象通常会提供对象类别,对象 id 或位置,或者其它合适的信息。

        内建函数isinstance(),利用它来确认一个对象的类型。

例如:使用isinstance()和type()函数检查类型

#!/usr/bin/env python

def displayNumType(num):
    print num, 'is',
    if isinstance(num, (int, long, float, complex)):
        print 'a number of type:', type(num).__name__
    else:
        print 'not a number at all!!'

displayNumType(-69)
displayNumType(9999999999999999999999L)
displayNumType(98.6)
displayNumType(-5.2+1.9j)
displayNumType('xxx')
函数 displayNumType() 接受一个数值参数,它使用内建函数 type()来确认数值的类型(或不是一个数值类型)。

输出:

-69 is a number of type: int
9999999999999999999999 is a number of type: long
98.6 is a number of type: float
(-5.2+1.9j) is a number of type: complex
xxx is not a number at all!!

7、Python的类型工厂函数

        Python 2.2 统一了类型和类,所有的内建类型现在也都是类,在这基础之上,原来的所谓内建转换函数象 int()、type()、 list() 等等,现在都成了工厂函数。 也就是说虽然他们看上去有点象函数,实质上他们是类。当你调用它们时,实际上是生成了该类型的一个实例,,象工厂生产货物一样。
下面这些大家熟悉的工厂函数在老的 Python 版里被称为内建函数:
int(), long(), float(), complex()
str(), unicode(), basestring()
list(), tuple()
type()
以前没有工厂函数的其他类型,现在也都有了工厂函数。除此之外,那些支持新风格的类的全新的数据类型,也添加了相应的工厂函数。下面列出了这些工厂函数:
dict()
bool()
set(), frozenset()
object()
classmethod()
staticmethod()
super()
property()
file()

8、Python标准类型的分类

       描述标准类型称为 Python 的“基本内建数据对象原始类型”。

(1)“基本”,是指这些类型都是 Python 提供的标准或核心类型。

(2)“内建”,是由于这些类型是 Python 默认就提供的。

(3)“数据”,因为他们用于一般数据存储。

(4)“对象”,因为对象是数据和功能的默认抽象。

(5)“原始”,因为这些类型提供的是最底层的粒度数据存储。


(6)“类型”,因为他们就是数据类型。

9、Python不支持的类型

       Python 目前还不支持的数据类型:

(1)char 或 byte
Python没有char或byte类型来保存单一字符或 8 比特整数,你可以使用长度为 1 的字符串表示字符或 8 比特整数。

(2)指针
        Python替你管理内存,因此没有必要访问指针。在Python中你可以使用 id()函数得到一个对象的身份号, 这是最接近于指针的地址。因为你不能控制这个值,所以其实没有太大意义。其实在 Python 中, 一切都是指针。
(3)int vs short vs long
       Python的普通整数相当于标准整数类型,不需要类似C语言中的 int、short、long 这三种整数类型。事实上Python的整数实现等同于C语言的长整数。 由于Python的整型与长整型密切融合,用户几乎不需要担心什么。 你仅需要使用一种类型,就是 Python 的整型。即便数值超出整型的表达范围
比如两个很大的数相乘, Python会自动的返回一个长整数给你而不会报错

(4)float VS double
       C语言有单精度和双精度两种浮点类型。 Python的浮点类型实际上是C语言的双精度浮点类型。Python 认为同时支持两种浮点类型的好处与支持两种浮点类型带来的开销不成比例,所以Python决定不支持单精度浮点数。对那些宁愿放弃更大的取值范围而需要更高精确度的用户来说,Python还有一种十进制浮点数类型Decimal,不过你必须导入decimal模块才可以使用它。浮点数总是不精确的。Decimals则拥有任意的精度,在处理金钱这类确定的值时,Decimal类型就很有用。 在处理重量、长度或其它度量单位的场合,float 足够用了。

三、总结

(1)Python的分类和模型还须进一步总结,不支持的类型可以使用Python其他的模板弥补。
(2)若有不足,请留言,在此先感谢!
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python编程基础之三对象 的相关文章

  • 如何手动计算分类交叉熵?

    当我手动计算二元交叉熵时 我应用 sigmoid 来获取概率 然后使用交叉熵公式并平均结果 logits tf constant 1 1 0 1 2 labels tf constant 0 0 1 1 1 probs tf nn sigm
  • Python 中的哈希映射

    我想用Python实现HashMap 我想请求用户输入 根据他的输入 我从 HashMap 中检索一些信息 如果用户输入HashMap的某个键 我想检索相应的值 如何在 Python 中实现此功能 HashMap
  • 安装了 32 位的 Python,显示为 64 位

    我需要运行 32 位版本的 Python 我认为这就是我在我的机器上运行的 因为这是我下载的安装程序 当我重新运行安装程序时 它会将当前安装的 Python 版本称为 Python 3 5 32 位 然而当我跑步时platform arch
  • 使用 Python 从文本中删除非英语单词

    我正在 python 上进行数据清理练习 我正在清理的文本包含我想删除的意大利语单词 我一直在网上搜索是否可以使用像 nltk 这样的工具包在 Python 上执行此操作 例如给出一些文本 Io andiamo to the beach w
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • 您可以格式化 pandas 整数以进行显示,例如浮点数的“pd.options.display.float_format”?

    我见过this https stackoverflow com questions 18404946 py pandas formatdataframe and this https stackoverflow com questions
  • 从Python中的字典列表中查找特定值

    我的字典列表中有以下数据 data I versicolor 0 Sepal Length 7 9 I setosa 0 I virginica 1 I versicolor 0 I setosa 1 I virginica 0 Sepal
  • 如何使用 Mysql Python 连接器检索二进制数据?

    如果我在 MySQL 中创建一个包含二进制数据的简单表 CREATE TABLE foo bar binary 4 INSERT INTO foo bar VALUES UNHEX de12 然后尝试使用 MySQL Connector P
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • Docker 中的 Python 日志记录

    我正在 Ubuntu Web 服务器上的 Docker 容器中测试运行 python 脚本 我正在尝试查找由 Python Logger 模块生成的日志文件 下面是我的Python脚本 import time import logging
  • 在 Sphinx 文档中*仅*显示文档字符串?

    Sphinx有一个功能叫做automethod从方法的文档字符串中提取文档并将其嵌入到文档中 但它不仅嵌入了文档字符串 还嵌入了方法签名 名称 参数 我如何嵌入only文档字符串 不包括方法签名 ref http www sphinx do
  • pyspark 将 twitter json 流式传输到 DF

    我正在从事集成工作spark streaming with twitter using pythonAPI 我看到的大多数示例或代码片段和博客是他们从Twitter JSON文件进行最终处理 但根据我的用例 我需要所有字段twitter J
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • 如何在 Windows 命令行中使用参数运行 Python 脚本

    这是我的蟒蛇hello py script def hello a b print hello and that s your sum sum a b print sum import sys if name main hello sys
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • 如何应用一个函数 n 次? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 假设我有一个函数 它接受一个参数并返回相同类型的结果 def increment x return x 1 如何制作高阶函数repeat可以
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk

随机推荐

  • HTTP协议原理

    一 http协议是什么 HTTP协议 全称HyperText Transfer Protocol 中文名为超文本传输协议 是互联网中最常用的一种网络协议 广泛应用于Web浏览器和Web服务器之间的应用层通信协议 在Internet上的Web
  • 基于flask与tk的网络粘贴板

    基于flask与tk的网络粘贴板 由于本人一直用 linux 所以平时和我的队友们交流代码 十分的不方便 没有办法 我就自己写一个功能简单但是特别适合我自己用的一个网络粘贴板 只有两个按钮 下载 和 上传 我的这个应用分成两个部分 一个是服
  • MFC之树形控件25

    1 树形控件 先了解相关知识 1 创建基于对话框的项目 2 删除对话框原有的内容 添加树形控件TreeControl 3 右击树形控件属性 然后添加相应属性 4 在资源视图里面右击icon文件夹 添加资源 选择icon导入预先准备好的图片
  • idea plugins一直在转圈解决方法

    方案一 配置代理 https plugins jetbrains com 然后重启idea 方案二 打开ip查看网站查看plugins jetbrains com的ip ip查看 然后将ip配置到host文件中 打开host文件 C Win
  • 胖AP与瘦AP的区别以及胖瘦AP组网的优劣对比

    一 胖瘦AP如何区分 无线AP通常可以分为胖AP Fat AP 和瘦AP Fit AP 两类 不是以外观来分辨的 而是从其工作原理和功能上来区分 当然 部分胖 瘦AP在外观上确实能分辨 比如有WAN口的一定是胖AP 胖AP除了前面提到的无线
  • 算法编程题-字符串类型题目

    1 介绍 在笔试面试中 字符串类型题目相当广泛 原因有一下几点 1 字符串可以看做是字符类型的数组 与数组的排序 查找 调整有关 2 很多其他类型的题目最终可能会转化成字符串类型的题目 2 需要掌握的几个概念 1 回文 2 子串 连续 3
  • NLP实践——VQA/Caption生成模型BLIP-2的应用介绍

    NLP实践 VQA Caption生成模型BLIP 2的应用介绍 1 简介 2 模型下载 3 运行环境 4 模型应用 1 简介 今天介绍一个跨模态模型 也是最近比较火的一个工作 叫做BLIP 2 很久很久之前我写过一个简单的image ca
  • ubuntu14.04安装CUDA7.0、CUDNN7.0详细步骤

    一 安装CUDA7 0 CUDA 7 0在Linux下的安装步骤参见官网手册 CUDA Getting Started Linux 其中提及了 run deb 等安装 1 检查你的电脑是否支持CUDA 检查GPU是否支持 输入如下命令 如果
  • uniapp运行到小程序报错之[ app.json 文件内容错误] app.json: app.json 未找到

    解决方法 在project config json文件下面新增如下代码 unpackage dist dev mp weixin是你自己的代码 打包下dist文件夹下的项目名称 和pages同级的文件夹 miniprogramRoot un
  • Angular学习笔记48:响应式表单-FormArray 和 FormGroup的多层嵌套

    继Angular学习笔记46 响应式表单 使用FormBuild快速构建表单 可以使用FormBuilder快速便捷的构建出需要的表单 有时候 在FormArray中 不仅仅是一个控件 有可能是多个 这个时候 这个FormArray中的元素
  • Dynamics CRM on premise 和 Skype for Business 集成显示用户状态

    Applies To Dynamics 365 online Dynamics 365 on premises Dynamics CRM 2016 Dynamics CRM Online Using Skype for Business w
  • EMC一些常见问题(面试也会稍微提及)

    什么是EMC测试 如何进行EMC测试 什么是EMC测试 如何进行EMC测试 EMC EMI设计 电子发烧友网 elecfans com 1 为什么要对产品做电磁兼容设计 答 满足产品功能要求 减少调试时间 使产品满足电磁兼容标准的要求 使产
  • STMF103学习笔记(三)——按键输入

    实验三 按键输入 注意输入模式的设置 按下时为高电平设置为下拉模式 按下时为低电平设置为上拉模式 这样输入时 上拉模式的得到高点平 下拉模式得到低电平 具体原理还不是很懂 按键IO输入初始化参考代码 void KEY Init 这里初始化k
  • 图像分割与目标检测与区别

    检测与分割的区别 https www leiphone com category yanxishe Fah5xOL3Qb96k1NL html 1 目标检测 预测包围盒 YOLO Fast RCNN 似乎还有个SSD 输入 一个矩阵 输入图
  • 6-python异常、错误、模块、包

    文章目录 1 异常 2 错误 3 模块 4 包 综合练习 1 异常 打开一个不存在的文件会引发异常 FileNotFoundError Errno 2 No such file or directory D 不存在的文件 txt f ope
  • Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException

    spring boot mybaits 出现异常 The error may exist in file F javatext basi code frame springboot query2 target classes mapper
  • 刷脸作为数据入口应用在新零售领域上

    日常生活中 我们所常见的人脸识别大多应用在安防领域 例如刷脸门禁 刷脸签到和刷脸考勤等 将人脸识别技术应用在零售消费领域 可能要从支付宝推出蜻蜓刷脸支付收银机开始 人脸识别技术在零售消费领域上作为支付凭证 除了刷脸支付 人脸识别技术应用在零
  • VUE 之 Jspreadsheet CE电子表格数据处理

    需求 将表格内容作为list集合 向后端传递 注意 需求默认展示表格为30行空表格 后端接口会拦截空值 所以需将未输入的行去掉 默认的Jspreadsheet 实现步骤 获取Jspreadsheet 数据并处理成后端所需参数格式 var t
  • 如何查看在rabbitMQ里面堆积的消息

    回顾上一节的内容 通过配置了stream来对MQ的简单的封装 主要定义接口 里面定义input以及output来绑定交换机 获取消息通道MessageChannel以及订阅通道SubscribableChannel对象 而消费端配置 str
  • Python编程基础之三对象

    一 简介 Python使用对象模型来存储数据 构造任何类型的值都是一个对象 再加上内建类型 标准类型运算符和内建函数 有助于更好的理解Python是如何工作的 二 详解 1 Python的对象 所有的 Python 对像都拥有三个特性 身份