Skip to content

简明Python教程

字数
8859 字
阅读时间
34 分钟

基础

字面常量

一串文本或者一个数字, 表示他本身而非其他含义, 使用的就是它字面意义上的值或是内容. ----它是一个常量, 因为他的值不能被改变.

数字 int/float

  1. 整数(可以是任何大小的整数): int
  2. 浮点数(小数/科学计数法): float

字符串 str

字符串(字符串就是一串词汇): str

单引号 '' / 双引号""

可以使用单引号/双引号来指定字符串, 所有引号内的空间, 诸如空格与制表符, 都将按原样保留

三引号 """ """/''' '''

可以通过三引号(""" """ 或 ''' ''' )来指定多行字符串. 双引号和单引号在三引号之间可以自由的使用

python
''' 这是一段多行字符串. 这是他的第一行
This is the second line.
"What's your name?," I asked.
He said "Bond, James Bond"
'''

字符串是不可变的

一串字符串一单创造, 就不能再改变它. 注: 单引号和双引号括起来的字符串是一样的, 他们不存在任何区别.

格式化方法 format()

python
# 推荐写法, 与书中不同
age = 20
name = 'Swaroop'

print(f'Why is {name} playing with that python?')

python中format()方法所做的事情便是将每个参数值替换至格式所在的位置.

python
# 对于浮点数 '0.333' 保留小数点(.)后三位
print('{0:.3f}'.format(1.0/3))

# 使用下划线填充文本,并保持文字处于中间位置
# 使用 (^) 定义 '___hello___'字符串长度为 11
print('{0:_^11}'.format('hello'))

# 基于关键词输出 'Swaroop wrote A Byte of Python'  
print('{name} wrote {book}'.format(name='Swaroop', book='A Byte of Python'))
注: Python中的 print 函数总是会以一个不可见的 "新一行" 字符: \n 结尾. 因此重复调用 print 将会在相互独立的一行中分别打印. 
python
# 防止 print 函数末尾出现换行符, 可使用 end 指定其应空白结尾 
print('a', end='')
print('b', end='')

转义字符 \

python
print('what\'s your name?')
转移字符功能
\n换行
\t制表符
\\反斜杠\
\"双引号"
\'单引号'
\r回车符
\b退格符
\f换页符
注: 在一个字符串中, 一个放置在末尾的反斜杠表示字符串将在下一行继续, 但不会添加新的一行.
python
"This is the first sentence. \
This is the sencond sentence.
"
相当于

"This is the first sentence. This is the sencond sentence."

原始字符串 R/r

如果你需要指定一些未经过特殊处理的字符串, 比如转义序列, 那么你需要在字符串前增加 r 或 R 来指定一个原始字符串

python
r"New lines are indicated by \n"
注: 针对正则表达式用户的提示: 在处理正则表达式时, 应全程使用原始字符串. 否则将会有大量的 Backwhacking 需要处理. 例如: 反向引用可以使用 \\1 或 r'\1' 来实现

变量

一种可以储存任何信息且可以操作他的方式

标识符命名

变量是标识符的一个例子. 标识符是为某些东西提供的给定名称. 在命名标识符时, 需要遵守以下规则:

  1. 第一个字符大写/小写的字母或下划线, 不能是数字
  2. 标识符的其他部分可以由字母 数字或下划线组成
  3. 标识符名称区分大小写

数据类型

变量可以将各种形式的值保存为不同的数据类型.

对象

Python将程序中的任何内容统称为 对象(Object). 注: 针对面向对象编程语言用户的提示: Python是强面向对象的, 因为所有的一切都是对象, 包括数字, 字符串与函数.

注: 针对静态编程语言程序员的提示: 变量只需要被赋予某一值, 不需要声明或定义数据类型. 

逻辑行与物理行

所谓物理行, 是你在编写程序时你所看到的内容. 所谓逻辑行, 是Python所看到的单个词句. Python会假定每一物理行对应一个逻辑行.

Python鼓励开发中每一行使用一句独立语句从而使代码更加可读. 如果你希望在一行物理行中指定多个逻辑行, 那么你必须通过使用分号 ; 来明确表明逻辑行或语句结束.

python
i = 5
print(i)

等同于

i = 5;
print(i);

等同于

i= 5;print(i);
注:如果你有一行非常长的代码, 可以使用通过反斜杠将其拆分为多个物理行, 这被称作显式行连接.
python
i = \
5

等同于 

i = 5

缩进

缩进在Python中十分重要, 在逻辑行的开头留下缩进(使用空格或制表符) 以确定各逻辑行的缩进级别, 用以确定语句的分组.

放置在一起的语句必须拥有相同的缩进, 每一组这样的语句被称为: 块.

错误的缩进可能会导致错误.

注: 如何缩进: 使用四个空格来缩进, 请确保你在缩进中使用数量一致的空格, 否则你的程序将不会运行,或引发不期望的行为. 

注: 针对静态编程语言程序员的提示: Python将始终对块使用缩进, 并且绝不会使用大括号.

运算符与表达式

大多数语句(逻辑行)都包含了表达式. 表达式可以拆分为运算符与操作数 运算符是进行某些操作, 并且可以用诸如 + / - / * 等符号或特殊关键词加以表达的功能. 运算符需要一些数据来进行操作, 这些数据就被称作操作数.

运算符

常见运算符含义备注
+加法也可用于字符串的连接
-减法也可以表示负数
*乘法
/除法
**乘方
//整除取值的整数
%取模余数
<<左移将数字的位向左移动指定的位数(二进制)
>>右移将数字的位向右移动指定的位数(二进制)
&对数字进行按位与操作
|对数字进行按位或操作
^异或对数字进行按位异或操作
~非(取反)对数字进行按位取反操作
<小于返回 Ture 或 False
>大于返回 Ture 或 False
==等于返回 Ture 或 False
>=大于等于返回 Ture 或 False\
<=小于等于返回 Ture 或 False
!=不等于返回 Ture 或 False
not布尔"非"返回 Ture 或 False
and布尔"与"返回 Ture 或 False
or布尔"或"返回 Ture 或 False

数值运算与赋值的快捷方式

一种比较常见的操作是对一个变量进行一项数学运算并将运算结果返回给这个变量.

python
a = 2
a = a * 3

等同于 

a = 2
a *= 3
注: 变量 = 变量 运算 表达式   会演变为  变量 运算 = 表达式

求值顺序

在给定表达式中, Python将优先计算较高优先级的运算符与表达式 建议使用圆括号操作符来对运算符与操作数进行分组, 以更加明确的指定优先级, 这也能使得程序更加可读.

Python计算优先级(同一行的优先级相同, 越靠前优先级越高)

优先级运算符备注
1(expressions) 、[expressions]、{key:value}、表示绑定或元组 表示列表 表示字典 表示集合
2x[index]、x[index:index]、x(grguments...) 、x.attribute下标、切片、调用、属性引用
3**求幂(开方)
4+x 、-x 、~x正、负、按位取反
5*、/ 、//、%乘、除、整除、取余
6+、-加、减
7>> 、<<移动
8&按位与
9^按位异或
10|按位或
11in、not in、is、is not、<、<=、>、>=、!=、==比较运算符, 包括成员资格测试和身份测试
12not布尔"非"
13and布尔"与"
14or布尔"或"
15if - else条件表达式
16lambdaLambda表达式

改变运算顺序

为了使表达式更加易读, 我们可以使用括号 (). 同时, 使用圆括号( ) 可以改变运算顺序

结合性

运算符通常由左至右结合. 具有相同优先级的运算符将从左至右的方式依次进行求值.

表达式

Python
length = 5
breadth = 2

area = length * breadth
perimeter = (length + breadth) * 2
print(f'Area is {area}.')
print(f'Perimeter is {perimeter}')

控制流

在Python中有三种控制流语句 : if for 和 while

if 语句

if语句用于检查条件. 如果条件为真(True) , 我们将运行一块语句(称作 if -block 或if块) , 否则将运行另一块语句(称作: else-block 或 else 块) . 其中else从句是可选的.

在 if 语句块的一个 if 语句中设置另一个 if语句, 并且可以如此嵌套下去, 这被称作嵌套的 if 语句

在if语句中, elif 和 else 部分都是可选的, 一个最小规模且有效的if语句是这样的:

python
if True:
	print("yes,it is true")

当Python完整执行了if语句及其相关的elif 和 else 语句后, 它将会移动至包含 if 语句的代码块的下一句语句中. .在完成这些工作后, Python会发现已行至程序末尾并宣告工作的完成.

while 语句

while 语句能够让你在条件为真的前提下重复执行某块语句. while语句是循环语句的而一种. while语句同样可以拥有 else 子句作为可选选项. 如果while循环中存在一个else代码块, 他将总是被执行, 除非你通过 break语句来中断这一循环.

while 语句在条件为True时, 会无限循环的运行, 直至条件为False , 或者使用break 语句中断循环.

for循环

for ... in 语句是另一种循环语句, 其特点是会在一系列对象上进行迭代, 即他会遍历序列中的每一个项目. 所谓序列就是一系列项目的有序集合.

for 循环中, else语句是可选的, 当循环中包含else语句时, 他会在循环结束后开始执行, 除非程序遇到break语句.

for ... in 能在任何队列中工作.

break语句

break语句用于中断循环语句, 也就是终止循环语句的执行. 即使循环条件没有变更为False, 或队列中的项目尚未尚未完全迭代依旧如此.

如果中断了一个for 或者 while循环, 任何相应循环中的else块都将不会被执行.

break语句同样适用于for 循环

continue 语句

continue语句用以告诉Python跳过当前循环块中的剩余语句, 并进行该循环的下一次迭代. continue 同样能用于for循环.

函数

函数 , 是指可重复使用的程序片段. 他们允许你为某个代码块赋予名字, 允许你通过这一特殊的名字在你程序的任何地方来运行代码块, 并可重复任何次数, . 这就是所谓的调用函数.

函数概念可能是在任何复杂的软件(无论使用的是何种编程语言)中最重要的构建块.

函数可以通过关键字 def 来定义. 这一关键字后跟一个函数的标识符名称, 再跟一对圆括号, 其中可以包括一些变量的名称, 再以冒号结尾, 结束这一行. 随后而来的语句块是函数的一部分.

python
def 函数名称(函数变量):
	代码块

函数参数

函数可以获取参数, 这个参数的值由你提供, 所以函数可以利用这些值来做一些事情. 这些参数与变量类似, 这些变量的值在调用函数时已被定义, 且在函数运行时均已赋值完成.

函数中的参数通过将其放置在用以定义函数的一对圆括号中指定, 并通过逗号予以分隔. 当我们调用函数时, 我们以同样的形式提供需要的值, . 在定义函数时, 给定变量的名称称为: 形参 在调用函数时, , 提供给函数的变量值称为: 实参

局部变量

当你在一个函数的定义中声明变量时, 他们不会以任何方式与身处函数之外但具有相同名称的变量产生关系, 即 这些变量名只存在于函数这一局部. 这被称为变量的作用域. 所有变量的作用域是他们被定义的块, 从定义他们的名字的定义点开始的.

global语句 (全局变量)

如果你想给一个在程序顶层的变量赋值( 即 它不存在于任何域中, 无论是函数还是类) , 那么必须用 global 语句来定义全局变量. 因为在不使用global 语句的情况下, 不可能为一个定义于函数之外的变量赋值. global语句可以清楚看出这一变量是在最外边的代码块中定义的.

global 语句用以声明 函数内的某个变量是一个全局变量, 因此, 但我们在函数中为该函数进行赋值时, 将影响到主代码中该变量的值. 在同一句global语句中, 可以指定多个全局变量,

python
global x, y, z

默认参数值

在一些函数中, 有一个参数是可选的, 并使用默认值, 以避免用户不提供值的情况. 默认参数值可以有效解决这一问题. 可以通过在函数定义时附加一个赋值运算符 = 来为参数指定默认参数值. 注:默认参数值应该是常数. 更确切的说, 默认参数值应该是不可变的.

注: 只有那些位于参数列表末尾的参数才能被赋予默认参数值, 即在函数的参数列表中, 拥有默认参数值的参数不能位于没有默认值的参数之前. 因为值是按参数所处的位置依次分配的, 例如:

python
def func(a, b =5)       # 有效

def func(b =5, a)       # 无效

关键字参数

一些具有许多参数的函数, 但又只想对其中一些参数进行指定, 那么可以通过命名来对这些参数进行赋值. , 这就是关键字参数. -----通过使用命名(关键字) 而非位置来制定函数中的参数. 这样做的优点是---其一: 不再需要考虑参数的顺序, 函数的使用将更加容易, 其二: 可以只对需要赋予值的参数赋值, 只要其他的参数都具有默认参数值.

可变参数

如果需要定义的函数里面有任意数量的变量, 也就是参数的数量是可变的, 这时候可以通过 * 来实现.

当我们声明一个诸如 *param 的星号参数时, 从此处开始直到结束的所有位置参数, 都将被收集并汇集成为一个称为 param 的元组.

但我们声明一个诸如 **param 的双星号参数时, 从此处开始直至结束的所有关键字参数都将被收集并汇集成一个名为 param 的字典.

return语句

return语句用于从函数中返回, 也就是中断函数. 我们也可以选择在中断函数时从函数中返回一个值.

如果return语句没有搭配任何一个值则代表返回 None , None在Python中代表一个特殊的类型, 表示 虚无. 例如: 它用于指示一个变量没有值, 如果有值则他的值便是 None (虚无).

每一个函数都在其末尾隐含了一句 return None , 除非该函数末尾有自己的return 语句,

Python中的 pass 语句常用语指示一个没有内容的语句块.

DocStrings

Python中有一个甚是优美的功能称作 文档字符串. 在称呼他时通常会使用: docstrings. DocStrings 是一款应当使用的重要工具, 它能够帮助你更好的记录程序并使其更加易于理解. 当程序运行时, 我们可以通过一个函数来获取文档.

函数的第一行逻辑行中的字符串是该函数的文档字符串.

我们可以使用函数的 __doc__ 属性来获取函数的文档字符串属性.

Python将所有的东西都视为一个对象, 这其中自然也包含函数.

模块

编写模块有很多种方法, 其中最简单的一种便是创建一个包含函数与变量, 以.py为后缀的文件. 另一种方法是使用撰写Python解释器本身的本地语言来撰写Python模块, 例如可以使用C语言来撰写Python模块, 并且在编译后 可以通过标准的Python解释器在你的Python代码中使用它们.

一个模块可以被其他程序导入并运用其功能.

按字节码编译的.pyc文件

导入一个模块是一件代价高昂的事情, 因此Python引入了一些技巧使其能够更快速的完成. 其中一种方式便是穿件按字节码编译的文件, 这一文件以 .pyc 为其扩展名, 便是将python转换成中间形式的文件, 这一 .pyc文件在你下一次从其他不同的程序导入模块时非常有用 -- 它将更加快速, 因为导入模块时所需要的一部分处理工作已经完成了. 同时 , 这些按字节码编译的文件是独立于运行平台的. 注: 这些.pyc文件通常会创建在与对应的.py文件所处的目录中, 如果Python没有相应的权限对这一目录进行写入文件操作, 那么 .pyc文件讲不会被创建.

from ... import ... 语句

如果希望直接将模块中的某个变量导入程序( 为了避免每次都要输入模块名), 那么可以使用 from 模块名 import 变量名 来实现. 注: 一般来说尽可能避免使用 from ... import ... 语句, 而去使用 import 语句. 这是为了避免在程序中出现名称冲突, 同时也使程序更加易读.

python
from math import sqrt
print("Square root of 16 is ", sqrt(16))

模块的 __name__

每个模块都有一个名称, 而模块中的语句可以找到他们所处的模块的名称. 这对于确定模块是独立运行还是被导入进来运行的这一特定目的来说大为有用.

当模块第一次被导入时, 它所包含的代码将被执行. 我们可以通过这一特性来使模块以不同的方式运行, 这取决于他是为自己所用还是从其他模块中导入而来. 这可以通过模块的 __name__属性来实现.

每一个Python模块都定义了他的__name__ 属性, 如果他与 __main__ 属性相同则代表这一模块是由用户独立运行的, 因此我们便可以采取适当的行动.

编写你自己的模块

每一个Python程序同时也是一个模块, 只需要他以 .py 为扩展名即可.

注: 推荐使用 import 语句而不推荐 from ... import ...语句, (如果本程序内出现与导入模块相同的函数名称, 使用 from ... import ... 语句会产生冲突. )

注: 使用 from ... import * 语句会导入模块内所有的公共名称, 而不会导入类似 __version__ 以双下划线开头的名称.

内置函数: dir()

内置的dir()函数能够返回由对象所定义的名称列表. 如果这一对象是一个模块, 则该列表会包括函数内所定义的函数 . 类与变量.

dir()函数接受参数, 如果参数是模块名称, 函数将返回这一指定模块的名称列表. 如果没有提供参数, 函数将返回当前模块的名称列表.

del语句: 用于删除一个变量或名称.

dir()函数能对任何对象工作.

必须遵守用以组织你的程序的层次结构. 变量通常位于程序内部, 函数与全局变量通常位于模块内部.如果希望组织起这些模块的话, 则使用 包. 包是指一个包含模块与一个特殊的 __init__.py 文件的文件夹, 后者向Python表明这一文件夹是特别的, 因为其包含了Python模块.

python
# 如果要创建一个名为 word 的包, 其中还包含着: asia  africa等其他子包, 同时这些子包都包含了诸如: india madagascar 等模块, 则会构建如下文件结构

-<some folder present in the sys.path>/
	- world/
		- __init__.py
		- asia/
			- __init__.py
			- india/
				- __init__.py
				- foo.pyy
		- africa/
			- __init__.py
			- madagascar/
				- __init__.py
				- bar.py

包是一种能够方便地分层组织模块的方式.

总结

函数是程序中的可重用部分 模块是一种可重用的程序 包是用以组织模块的另一种层次结构.

数据结构

数据结构基本上人如其名---它们只是一种结构, 能够将一些数据聚合在一起. 即数据结构是用来储存一系列相关数据的集合. Python中有四种内置的数据结构: 1. 列表 list 2. 元组 tuple 3. 字典 dic 4. 集合 set

列表 list[]

列表是一种用于保存一系列有序项目的集合, 即 可以利用列表保存一串项目的序列. 列表应使用方括号 [] 括起来, 这样Python才能识别指定了一张列表. 列表一旦创建, 则可以添加 移除或搜索列表中的项目. 正因为我们可以向列表添加或删除项目, 所以列表是一种可变的数据类型, 即列表是可以被改变的 .

有关对象与类的快速介绍.

列表是使用对象与类的实例.

一个类也可以带有方法, 也就是说对这个类定义仅对于他启用某个函数. 只有当你拥有一个属于该类的对象时, 你才能使用这些功能.

一个类同样也可以具有字段, 他是只为该类定义且只为该类所用的变量.

python
list.append() 方法: 向列表中添加一个对象(元素)

list.sort()方法: 对列表进行排序

del list[] : 删除列表中指定索引的元素

元组 tuple()

元组用于将多个对象保存在一起. 可以将元组看做近似一个列表, 但是不能提供列表能提供的广泛功能. 元组的一大特征类似与字符串, 他们是不可变的, 即元组不能被编辑或更改.

元组是通过特别指定项目来定义的, 在指定项目时, 你可以给他们加上括号, 并在括号内部用逗号进行分隔.

元组通常用于保证某一语句或某一用户定义的函数可以安全地采用一组数值, ,意即元组内的数值不会改变 .

元组同时也是一个序列 .

注:  一个空的元组由一对圆括号构成, 例如:  my_empty = ()
一个只拥有一个元素的元组必须在第一个元素(也是唯一一个元素)后面加上一个逗号, 例如: singlenton = (2,)

字典 dict

字典就像是一本地址簿, 如果你知道了他或者她的姓名, 你就可以在这找到其地址或是能够联系上对方的更多详细信息. 即我们将键(keys) 与 值(values)联立在一起, 但是键值必须是唯一的.

只能使用不可变对象(如字符串) 作为字典的键值, 但是可以使用可变或不可变对象作为字典的值.

成对的键与值之间使用冒号 : 分隔, 而每一对键值对与键值对之间使用逗号分隔, 然后全部由花括号括起.

python
dic = {key1:values1, key2:values2,......}

字典中成对的键值对配对不会以任何方式进行排序, 如果希望为他们安排一个特别的次序, 只能在使用字典之前自行进行排序.

字典属于 dict 类下的实例或对象.

python
# 查询某个键的值
dict[键名]

# 删除某个键值对
del dict[键名]

# 添加键值对
dict[键名] =

# 访问字典中每一对键值对的信息
dict.items()

# 查询某个值是否存在字典中
查询值 in dict

序列

列表 元组 和字符串都可以看作是序列的一种表现形式,

序列主要的功能是资格测试(即 in 与 not in 的表达式) 和索引操作, 他们能够允许我们直接获取序列中的特定项目.

序列的三种形态: 列表, 元组与字符串, 同样拥有一种 切片运算符, 它能够允许我们从序列中获取某段切片--- 也就是序列中的一部分.

序列的一大优点在于可以使用同样的方法访问 元组 列表与字符串.

集合set()

集合是简单对象的无序集合. 当集合中项目存在与否比起次序或其出现次数更加重要时, 我们就会使用集合. 通过使用集合, 可以测试某些对象的资格或情况, 检查他们是否是其他集合的子集, 找到两个集合的交集等.

引用2

当创建了一个对象并将其分配给某个变量时, 变量只会查阅某个对象 , 并且他也不会代表对象本身. 即 变量名只是指向计算机内存中储存了响应对象的那一部分. 这叫做将名称绑定给那一个对象.

如果希望创建一份诸如序列等复杂对象的副本(而非整数这种简单的对象), 必须使用切片操作来制作副本. 如果只是将一个变量名赋予另一个名称, 那么他们都将 查阅 同一个对象,

字符串的更多内容

字符串同样也是一种对象, 它也具有自己的方法, 可以做到检查字符串中的一部分或者是去掉空格等几乎一切事情.

在程序中使用的所有字符串都是 str 类下的对象.

str.startswith()方法用于查询字符串是否以给定的字符串内容开头 in运算符用以检查给定的字符串是否是查询字符串中的一部分.

str.find()方法用于定位字符串中给定的子字符串的位置. 如果找不到相应的子字符串, find方法会返回 -1 .

str.join() 方法用于连接序列中的项目, 其中字符串会作为每一项目之间的分隔符, 并以此生成并返回一串更大的字符串.

解决问题

分析问题 --> 设计程序 --> 代码实现.

软件开发的流程

What / 做什么(分析) How / 怎么做(设计) Dolt / 开始做(执行) Test / 测试(测试与修复结果) Use / 使用(操作或开发) Maintain / 维护(改进)

编写程序时推荐的一种方式是: 进行分析与设计, 开始实现一个简单的版本, 测试并修复错误, 开始使用以确保工作状况皆如所期望那般. 可以向程序中添加任何所希望拥有的功能, 并继续去重复这一" 开始做 --> 测试 --> 使用 " 循环, 需要做多少次就去做多少次.

程序是成长起来的, 不是搭建出来的.

面向对象编程

围绕函数设计我们的程序, 也就是那些能够处理数据的代码块, 这被称作 面向过程的编程方式. 另一种组织程序的方式, 将数据与功能进行组合, 并将其包装在称作 ' 对象' 的东西内, 在大多数情况下, 可以使用过程式编程, 但是当你需要编写一个大型程序或面对某一个更适合此方法的问题时, 你可以考虑使用面向对象式编程技术.

类与对象是面向对象编程的两个主要方面. 一个 类(class) 能够创建一种新的类型 ( type), 其中对象(object) 就是类的实例(instance) . 可以这样类比: 你可以拥有类型 int 的变量, 也就是说储存证书的变量是 int 类的实例(对象).

对象可以使用属于它的普通变量来储存数据. 这种从属于对象或类的变量叫做 字段(field). 对象还可以使用属于类的函数来实现某些功能, 这种函数叫做类的方法(mothod). 字段 和方法很重要, 它有助于我们区分函数与变量, 哪些是独立的, 哪些又是属于类或对象的. 总之, 字段与方法统称类的属性(attribute)

字段有两种类型, 他们属于某一类的各个实例或对象, 或者是从属于某一某一类本身. 他们分别被称作实例变量(instance variables) 与类变量(class variables)

通过 class 关键字可以创建一个类, 这个类的字段与方法可以在缩进代码块中予以列出.

self

类方法与普通函数只有一种特定的区别: 前者必须多加一个参数在参数列表的开头, 这个名字必须添加到参数列表的开头, 但是你不用在你调用这个功能时为这个参数赋值, Python会为他提供. 这种特定的变量应用是对象本身, 按照惯例, 它被赋予 self 这一名称.

尽管你可以为这一参数赋予任何名称, 但是强烈推荐你使用 self 这一名称, 其他的任何一种名称绝对会引人皱眉. 这一标准名称能带来诸多好处: 任何一位程序读者能够立即认出他, 甚至是专门的IDE(集成开发环境)也可可以为你提供帮助, 只要你使用了 self 这一名称.

如果你有一个没有任何参数的方法, 你依旧必须拥有一个参数: self

最简单的类(class)如下

python
class Person:
	pass # 一个空的代码块

p = Person()
print(p)

方法

类与对象一如函数那般都可以带有方法, 唯一不同的在于他们还拥有一个额外的 self 变量.

__init__ 方法

在Python的类中, 有不少方法的名称具有特殊的意义. __init__ 方法会在类的对象被实例化时立即运行, 这一方法可以对任何你想进行操作的目标对象进行初始化操作. (注意: init 前后需加上 __)

类变量与对象变量

类与对象的功能部分 即方法. 类的数据部分: 也就是字段, 只不过是绑定到类与对象的命名空间的普通变量, 这代表这些名称仅在这些类与对象所存在的上下文中有效, . 所以他们被称作: 命名空间.

字段(field ) 有两种类型: 类变量 与 对象变量. 他们根据究竟是类 还是 对象拥有这些变量来进行分类.

类变量(class variable) 是共享的, 他们可以被属于该类的所有实例访问. 该类变量只拥有一个副本, 但任何一个对象对类变量作出改变时, 发生的变动将在其它所有实例中都会得到体现.

对象变量(object variable) 由类的每一个独立的对象或实例所拥有的. 在这种情况下, 每个对象都拥有属于他自己的字段的副本, 也就是说, 他们不会被共享.

贡献者

文件历史

撰写