对象与实例,类型与方法*

  • 这都是什么鬼

到目前为止我们已经学习了好几种Python的数据类型,以及针对这些数据类型我们可以执行操作的方法。如果你看过别的Python教程,还会接触到对象、实例等一堆名词,头都是大的。这一节我们将对类型、类型的方法、实例、对象这些概念进行一个简单的区分,以方便后面的学习。

类型(class),也就是我们给大家介绍的各种数据类型。后期我们还可以自己创建新的类型。在Python中,我们可以用type()来查看一个值的类型:

>>> type(3)
<class 'int'>
>>> type(True)
<class 'bool'>

接着给大家介绍对象(object)…嗯…没毛病…之前提过一句,你在Python里面创建一个值(简单到一个整数3,复杂一点到一个列表[233, True, ‘hahahhahaha’]),Python实际是在你的电脑内存中取了一块儿,把这个值存起来。装着你创建的这个值的,就称为对象,我们可以把它理解为一个容器,一个“坑”。 对象把计算机到底是如何在内存里面创建了这个值这些复杂的过程隐藏起来,只把你需要的两件东西展现给你——对象里面装着的值和对象所属的类型。前一节我们说给变量赋值,实际上就是让变量指向某个特定对象的过程。

方法(method)则是每种类型所支持的操作。比如整数、浮点数可以你除以我,我除以你,因为数字类型支持除以这种方法,然鹅字符串就不能相除。

然后说实例(instance)。易与对象混淆,通过前面的讲解我们知道,对象是容器,里面的东西才是实例。

实例和类型的关系,在此举一例:

大学的时候,我去上语言学课,老师问:”同学们你们见过树吗?”大家都想,哇咧树谁没见过啊,窗外那不就是树嘛。老师看了一眼窗外说,那是白杨树,我问的是树。然后大家明白了,原来是个文字游戏。

实例和类型就是白杨树和树的关系。

例如我们有一个整数3,那实际上就是内存中创建了一个对象,这个对象的类型是整数,对象里面装着一个整数的实例3,这个对象支持和别的整数浮点数相加减乘除等一系列方法。

 

  • 变量不属于任何类型

变量不属于任何类型,变量本身只是个名字,变量当前指向的对象才有类型:

>>> a = 666
>>> type(a)
<class 'int'>
>>> a = 666.6
>>> type(a)
<class 'float'>

 

  • 类型的转换

我们看一个例子:

>>> True + 3.5
4.5

哟能耐啊,这也行?这称为Python对数据类型的隐性转换(implicit type conversion)。所谓隐性,就说Python内部自己做了这个处理,不用你干什么。在Python中,浮点数、整数、布尔值满足:布尔值⊂整数⊂浮点数(⊂是个包含于符号)。布尔值只有俩,True默认被转换为整数1,False则是整数0。一个整数能用浮点数形式表示,一个浮点数却没法用整数形式表示,因此整数包含于浮点数。这就进一步解释了本章第一节为什么运算中只要出现一个浮点数,运算结果就是浮点数———参与运算的整数被Python隐性转换了类型。

Python中,我们还能对数据类型做强制转换(explicit type conversion)。之前我们每介绍一种数据类型都注明它的英文是啥,有的有简写,这里就派上用场了:

搬运:整数int, 浮点数float,布尔值bool,字符串str,列表list,元组tuple。转换的方法是,在英文后面加上括号,括号内填被转换的对象,当然,转换必须符合逻辑,请大家自行实验数据类型之间的转化。在这里举两例看似符合逻辑的:

>>> int(3.4)
3
>>> int('3.4')
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in 
    int('3.4')
ValueError: invalid literal for int() with base 10: '3.4'

喵喵喵?这说的是个啥?Python中,浮点数可以用int()强制转化为整数,然鹅一个字符串的内容是浮点数,却不能直接用int()转换,没有为什么……我们可以用:

>>> int(float('3.4'))
3

接着:

>>> list(1, 2, 3, 4, 5)
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in 
    list(1, 2, 3, 4, 5)
TypeError: list() takes at most 1 argument (5 given)

喵喵喵?我又干嘛了?嗯哼,你发现了一个用我们现在学的知识还解决不了的问题。你会发现,所有的强制转换,如果你在括号里面填上超过1个对象,就会报这个错。不要着急,这是一个带星号的章节,继续往后学习,不时回来看看,你会有新的发现。

 

  • 本节练习

如果在Python中输入一下表达式,将会返回什么类型的对象?想想为什么

  1. False + True
  2. 233 * 666 ** 2.33
  3. 333 // 3 + 44 % 2
  4. 1 + 1 == 2 or 7 >= 7

看答案

>>> type(False+True)
<class 'int'>
>>> type(233 * 666 ** 2.33)
<class 'float'>
>>> type(333 // 3 + 44 % 2)
<class 'int'>
>>> type(1 + 1 == 2 or 7 >= 7)
<class 'bool'>

酱哦

 

如果还有什么问题或者发现了文章的错误,欢迎给我留言!邮箱可以随便乱写~

发表评论

电子邮件地址不会被公开。 必填项已用*标注