Python中创建和使用类:
使用类允许你将行为和状态打包放在一个对象中。
行为(方法):把它想成是函数,这是一个完成某种工作(或实现一种行为)的代码块;
状态(属性):把它想成是变量,这是一个在类中存储值的位置;
我们说将行为和状态打包在一起,就是在说一个类包装了函数和变量。
由类创建对象:
要使用一个类,需要从何类创建一个对象,这称为对象实例化(调用),就是说你要调用一个类来创建一个对象:
创建一个名为CountFromBy的空类,类名前class为关键字,注意冒号,然后提供代码组;这里pass是一个合法的语句,虽然什么也不做,但是我们不能不写语句,否则解释器会报错到这里,类已经存在,下面从这个类创建对象:
在类名后加小括号来创建一个对象,然后将新创建的对象赋给某个变量:a,b,c从创建对象看起来与调用函数非常相似。Python编程社区有一个普遍认可的约定:函数用小写字母命名,并且有下划线来强调,而类名用CamelCase形式命名,即单词拼接在一起,而且各个单词的首字母大写。所以很清楚count_from_by()是一个函数调用,CountFromBy()是创建一个对象
我们希望CountFromBy做什么?:递增计数器
递增计数器源代码调用方法:
c.increase() <==>CountFromBy.increase(c)
上面右边是解释器遇到左边的代码时在后台执行的代码,咋一看,解释器这种转换有些奇怪,实际上,Python编程社区中一种约定俗成的方法是各个方法的第一个参数指定一个特殊的名字:self.编写代码时可以把"self"想成是当前对象的一个别名。在对象上调用一个方法时,Python会把调用对象实例作为第一个参数,这个对象总是赋给各个方法的self参数。调用一个方法时,不需要为self提供一个值,因为解释器会为你做这件事情。
increase方法代码
假设这个类维护两个属性:val和incr,val为当前对象的当前值,incr包含每次调用increase时val的增量。我们不能直接写成:val += incr. 这是为什么?
对象共享行为,但不共享状态:
类行为会由它的各个对象共享,而状态不能共享,每个对象会维护其自己的状态。表面看这行代码没什么问题,不过想想看这个increase方法结束时会发生什么:val和incr都只是存在于increase中,它们会超出其作用域,因此方法结束的瞬间它们就会被撤销。
如果要引用类中的一个属性,必须在属性名面前加上一个self. self中的值是一个别名,指示调用这个方法的对象。
使用前要初始化属性值:
在Python中,不论在哪里使用变量,都必须首先用一个初始值初始化:dunder "init"初始化属性 使用规则在代码中足以体现。由于__init__是一个方法,方法就是一个伪装的函数,所以可以向方法传入你希望的任意多个参数值,你要做的就是提供参数名。
dunder repr行代码
假设我们没有这段代码,按F5运行程序:
出现的结果我们试图访问h的值时,解释器变得异常。
我们使用dunder repr的意图:返回对象的标准字符串表示
使用后,解释器能正常显示我们需要得到的结果:
测试1 测试2 测试3 测试4,比较特殊至此,我们对类有了足够的了解,使我们能够创建代码来挂接Python的上下文管理协议。
by PengSW_10 on 2019/1/30
网友评论