Python面向对象
一、面向对象编程
面向对象是一种编程思想,Object Oriented Programming,简称OOP。把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。他让我们在分析和解决问题时,把思维和重点转向现实中的客体中来,然后通过UML工具理清这些客体之间的联系,最后用面向对象的语言实现这种客体以及客体之间的联系。它分为面向对象的分析(OOA),面向对象的设计(OOD),面向对象的编程实现(OOP)三个大的步骤。
面向过程编程就是分析出解决问题所需要的步骤,然后用函数一步步实现,实现的时候一个一个的依次调用。
再Python中,一切皆对象,也可以自定义对象。
假设我们班级学生的进行自我介绍,为了表示每个同学的个人信息,面向过程的程序可以用一个dict表示:
xiaoming = { 'name':'xiaoming', 'age':20, 'hometown':'北京' } xiaohua = { 'name':'xiaohua', 'age':21, 'hometown':'河北' } def print_info(stu): print('姓名:%s,年龄:%s,家乡:%s'%(stu['name'],stu['age'],stu['hometown'])) print_info(xiaoming) print_info(xiaohua)
在我们显示生活中,是每一位同学进行自我介绍,而不是像我们的代码,先介绍学生信息,然后再去看介绍了谁。
如果采用面向对象的设计思想,我们首先考虑的不是程序的执行流程,而是stu应该被视为一个对象,这个对象拥有name,age,hometown等属性。
如果我们要进行自我介绍,首先要创建除一个学生对象,然后给对象发出一个pront_info消息,对象自己介绍自己的信息:
class Student(object): def __init__(self,name,age,hometown): self.name = name self.age = age self.hometown = hometown def print_info(self): print('姓名:%s,年龄:%s,家乡:%s'%(self.name,self.age,self.hometown)) xiaoming = Student('小明',20,'北京') xiaohua = Student('小华',22,'河北') xiaoming.print_info() xiaohua.print_info()
二、类和对象
什么是类:是某一类事物,不具体,是一个抽象的模板。比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
对象(实例):具体的事物,具体的描述出来,姓名叫小明,年龄20岁。
类和对象的分辨: 具体 和 大概、抽象。
在python中定义一个Student类:
class Student(object): #创建类的关键字:class pass
创建一个类的实例(对象):
xiaoming = Student() #通过 变量名 = 类名()
xiaoming指向的就是一个Student实例,可以自由的给实例变量绑定一个属性,比如,给xiaoming添加一个name属性:
class Student(object): pass xiaoming = Student() xiaoming.name = '小明' print(xiaoming.name) #小明
由于类可以起到模板的左右,所以我们可以将一些认为必须的属性强制填写进去,通过一个特殊的__init__()方法,在创建实例的时候,就把name,age,hometown等属性绑上去:
class Student(object): def __init__(self,name,age,hometown): pass
我们可以看到__init__()函数中有一个self参数,self表示创建的实例本身,我们就可以把各种属性绑定到self,因为self就是实例本身。xx = Student() -->那么self就是xx。我们可以把各种属性绑定到xx。
注意,我们在__init__()内设置了属性后,在创建实例的时候就不能传入空的参数了,必须传入__init__()方法匹配的参数,self不需要传入,python解释器会自己把实例变量传进去。
class Student(object): def __init__(self,name,age,hometown): pass xiaoming = Student() #报错信息 __init__() missing 3 required positional arguments: 'name', 'age', and 'hometown'
class Student(object): def __init__(self,name,age,hometown): self.name = name self.age = age self.hometown = hometown xiaoming = Student('小明',21,'河北') print(xiaoming.name)
__init__()函数第一个参数永远是self,除此之外,Student() 执行的时候,会自动调用__init__()方法。进行对对象初始化。
三、创建一个对象执行的步骤
1. stu = Student() -> 在内存中开辟一块空间,创建一个Student类的一个实例,并把引用赋值给stu
2. 自动调用__init__(self)方法,把传入的参数和self(实例对象本身)绑定