面向对象编程
一、什么是‘对象’
”面向对象“的核心是“对象”二字,而对象的精髓在于“整合“,即把‘数据’和‘功能’整合在一起!所以可以说‘对象’就是一个容器,
一个把‘数据’和‘功能’放在一起的盒子!!
优点:使得软件具有更高的扩展性,减少代码冗余!
二、类与对象
如果多个对象有相似的数据与功能,那么该多个对象就属于同一种类。有了类的好处是:我们可以把同一类对象相同的数据与功能存放到类里,而
无需每个对象都重复存一份,这样每个对象里只需存自己独有的数据即可,极大地节省了空间。所以,如果说对象是用来存放数据与功能的容器,
那么类则是用来存放多个对象相同的数据与功能的容器。但是需要强调的是:在程序中,必须要事先定义类,然后再调用类产生对象(调用类拿到
的返回值就是对象)。产生对象的类与对象之间存在关联,这种关联指的是:对象可以访问到类中共有的数据与功能,所以类中的内容仍然是属于
对象的,类只不过是一种节省空间、减少代码冗余的机制,面向对象编程最终的核心仍然是去使用对象。
三、面向对象编程
以选课系统为例:
class Student: # 类的命名应该使用“驼峰体” # 1、变量的定义 stu_school='oldboy' # 数据 # 2、功能的定义 # 功能 def tell_stu_info(obj): print('学生信息:名字:%s 年龄:%s 性别:%s' %( obj['stu_name'], obj['stu_age'], obj['stu_gender'] )) def set_info(obj,x,y,z): obj['stu_name']=x obj['stu_age']=y obj['stu_gender']=z # print('哈哈哈') # 类定义阶段就会执行 stu1=Student() # 每实例化一次Student类就得到一个学生对象 stu2=Student() stu3=Student()
想在实例化的过程中就为三位学生定制各自独有的数据:姓名,性别,年龄,需要我们在类内部新增一个__init__方法,如下
class Student: # 1、变量的定义 stu_school='oldboy' #该方法会在对象产生之后自动执行,专门为对象进行初始化操作,可以有任意代码,但一定不能返回非None的值 def __init__(obj,x,y,z): obj.stu_name=x obj.stu_age=y obj.stu_gender=z # 实例化 stu1_obj=Student('egon',18,'male') # Student.__init__(空对象,'egon',18,'male') stu2_obj=Student('lili',19,'female') stu3_obj=Student('jack',20,'male') # 调用类的过程又称之为实例化,发生了三件事 # 1、先产生一个空对象 # 2、python会自动调用类中的__init__方法然将空对象已经调用类时括号内传入的参数一同传给__init__方法 # 3、返回初始完的对象
总结__init__方法:
1、会在调用类时自动触发执行,用来为对象初始化自己独有的数据
2、__init__内应该存放是为对象初始化属性的功能,但是是可以存放任意其他代码,想要在类调用时就立刻执行的代码都可以放到该方法内
3、__init__方法必须返回None
四、属性访问
class Student: # 1、变量的定义 stu_school='oldboy' count=0 # 空对象,'egon',18,'male' def __init__(self,x,y,z): Student.count += 1 self.stu_name=x # 空对象.stu_name='egon' self.stu_age=y # 空对象.stu_age=18 self.stu_gender=z # 空对象.stu_gender='male' # return None # 2、功能的定义 def tell_stu_info(self): print('学生信息:名字:%s 年龄:%s 性别:%s' %( self.stu_name, self.stu_age, self.stu_gender )) def set_info(self,x,y,z): self.stu_name=x self.stu_age=y self.stu_gender=z def choose(self,x): print('正在选课') self.course=x # 类中存放的是对象共有的数据与功能 Student.school # 访问数据属性,等同于Student.__dict__['school'] Student.choose # 访问函数属性,等同于Student.__dict__['choose'] # 但其实类中的东西是给对象用的 # 1、类的数据属性是共享给所有对象用的,大家访问的地址都一样 print(id(Student.stu_school)) print(id(stu1_obj.stu_school)) print(id(stu2_obj.stu_school)) print(id(stu3_obj.stu_school)) # 2、类中定义的函数主要是给对象使用的,而且是绑定给对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法,内存地址各不相同 # 类调用自己的函数属性必须严格按照函数的用法来 print(Student.tell_stu_info) print(Student.set_info) Student.tell_stu_info(stu1_obj) Student.tell_stu_info(stu2_obj) Student.tell_stu_info(stu3_obj)