您的位置:首页 > 编程语言 > Python开发

Python从入门到放弃(五):类细讲

2016-09-16 01:02 435 查看


Ⅰ.入门


一:编写基础


1.类与实例(他们在python中都是对象)

类提供默认行为,是实例的工厂
实例是程序处理的实际对象:各自有独立的命名空间,但是继承类中的变量名。
类来自语句声明,实例来自调用。
类和实例都是对象,并且是两种不同的对象类型.
1
2
3
4


2.最基本建立过程

语法模板:
class 类名:
语句1
语句2
。 。 。
语句n
1
2
3
4
5

例1: 


 



解释:
class创建类对象并且将其赋值给变量名(创建了类并且赋值给了FristClass)
Class内的顶层赋值语句(不是在def里面创建的)会创建类的属性(包括函数名和一些变量).类属性提供对象的状态和行为。
像函数那样调用类对象回创建新的实例对象。每次类调用的时候,都会创建并且返回新的实例对象.实例对象代表程序领域中的具体对象,每个实例对象继承类的属性并且获得自己的命名空间。
方法中对self属性做赋值运算会产生每个实例自己的属性。(就像上面的setData函数中产生了新的data属性一样),但是在使用的时候必须先赋值,就像上面先调用setData函数之后才能调用show(),不然会错误。同时,也是创建修改的实例对象中的数据,而不是类中的数据.
每个实例拥有自己的属性,但是共用类的方法
类通常是通过对self参数进行赋值运算从而建立实例的所有属性的。就像上面data的出现,但是不是必须如此。程序可以取出,修改,或创建其所引用的任何对象的属性。(这里是c++学习不一样的地方)
1
2
3
4
5
6
7

例2: 


 



总结:
类属性是在类的顶层语句中创建的.实例中并不会有类中的属性,但是实例会通过继承搜索来找到他的创建它的类中的这个属性.(这就是我们说继承的原因,很像一些东西被继承下来一样,事实上只是向上搜索罢了)
实例中def方法创建的(简单来说可以这么理解.)属性就成为实例本身自己的属性.而且可以不通过内置函数访问.可以直接创建一个实例中的属性.
在编写类方法的时候,二话不说,方法前面的第一个参数加上self. self是正确处理实例的一个重要参数,所以必须要带上去.
1
2
3
4


3.类继承

前面是类和实例之间的关系,那么这里就是类和子类之间的关系. 

自然界是层次的,那么类之间也能够是层次的.在较低的层次重写一些属性,实现特殊需要的子类. 
实例从类中继承,而子类继承于超类. 
继承语法模板:
class 类名(要继承的类名):
语句1
语句2
。。。
语句n
1
2
3
4
5

例子: 


 



解释:
被继承的那个类放在声明的括号中就行了
子类从父类中继承属性。当读取(使用)子类属性的时候,若是它并不存在与子类中,python会自动搜索这个属性。实例会继承所有可读取类的属性。先是搜索自己,然后搜索创建自己的类,然后搜索其类的超类.直到找到或者找不到.
在子类中show()的方法进行了重写,就会覆盖继承的父类的show()方法。但是父类中的show()方法并不会改变(只是定制而不影响),我们把这种在树的较低处发生的重新定义的,取代属性的动作叫做重载.

注意:
对于类和模块的关系,要是一个类是写在了一个模块内部的,我们直到class实际上是运行一些代码块并且返回一个类对象赋给类名.比如上面的class FirstClass就是后面被赋予的变量名.同样,载入一个写了类的模块也像普通的那样载入.
比如,我的模块名叫做test.py,里面有一个类叫做Leo,则载入方式有
from test import Leo
X=Leo()
.......
或者
import test
X=test.Leo()
......
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15


4.运算符重载初步

例子: 


 



解释:
当新的实例构造的时候,会调用__init__,__init__相当于c++中的构造函数,但是概念要更加简单。
当LastClss实例出现在+表达式中的时候,会调用__add__,使用__add__能够通过重载直接处理两个对象的+运算问题
当打印一个对象的时候(从技术上来讲,当通过str内置函数或者python内部的等价形式来将其转化为打印字符串的时候),调用__str__.对于print,python把要打印的对象传递给__str__中的self,该方法返回的字符串看作是对象的打印字符串。于是,使用__str__,我们可以直接用print来显示一个对象而不是通过一个其他的函数.
其他的运算符重载方式同上.
从上面知道LastClass继承了SecondClass,所以会继承secondclass的show方法,所以上面输出的时候显示的是use second。。。。
1
2
3
4
5
6


5.令人疑惑的例子(重要)


 



“` 

解释: 

首先,leo类中没有添加任何东西,pass语句表示什么也不做 

利用前面讲的性质手动添加属性(这时候类里面有name和age两个属性) 

这个时候实例本身没有属性,实例对于类的继承也是搜索上面的类.,所以,在没有改变之前,就连值都还是类中的值。但是某一个实例改变属性值的时候,它便有了自己的属性.同时不会影响到上层的类的属性.因此,这个时候,x有了自己name属性,但是y依然需要从类中来找. 

先打个预防针:本质上面,命名空间对象的属性都是以字典的形式来实现的,而类继承树只是连接其他字典的字典而已.(很抽象,之后会详细讨论) 
dict属性是针对大多数基于类的对象的命名空间字典(注意:leo有自己的name,age。X也有自己的name,但是y什么也没有,因为y没有赋值改变的操作。所以只会搜索到它的类中去找 
class指出连接的类.bases指出一个类的超类. 

最后的那部分说明,方法或是什么并不仅仅局限在一个class中,也可以在外部创建,然后赋值连接到类的内部也是一样可以的.这些都显示了Python的灵活性. 

对于新手的建议就是老老实实的把一些方法什么的规规矩矩的写在类的内部,先练习好基本的格式,然后再扩展到动态.


二:类创建详细步骤

通过一个关于人事管理的程序,下面讲创建一个实际可用的类需要的基本步骤


版本一:


 

结果 




步骤1:创建实例

1.构思类的功能和性质,应该得到一个什么样的类 

2.想好在这个类中应当有的属性(在c++中被称为成员变量) 

3.构造一个好的构造函数(这里有个地方注意,对于默认参数,当前一个参数为默认参数后,后面的所有参数必须规定为默认参数) 




步骤2:添加行为方法

1.有成员变量是不够的,还要构思这个类能够有什么样的行为 

2.对构思好的行为编写成员函数 




步骤3:运算符重载

根据需要重载运算符使运算更加贴近自己编写的类,其实这步可要可不要. 




步骤4:通过子类定制行为


 

1.类方法总是可以在一个实例中调用(通常都可以这么做,Python把该实例自动地发给self参数)Instance.method(args…..) 

2.或者通过类来调用(较少使用,其中我们必须要手动的传递实例进去) 

Class.method(instance,args…..)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python学习