面向对象基础

面向对象编程

一、什么是‘对象’

  ”面向对象“的核心是“对象”二字,而对象的精髓在于“整合“,即把‘数据’和‘功能’整合在一起!所以可以说‘对象’就是一个容器,

   一个把‘数据’和‘功能’放在一起的盒子!!

  优点:使得软件具有更高的扩展性,减少代码冗余!

二、类与对象

  如果多个对象有相似的数据与功能,那么该多个对象就属于同一种类。有了类的好处是:我们可以把同一类对象相同的数据与功能存放到类里,而

  无需每个对象都重复存一份,这样每个对象里只需存自己独有的数据即可,极大地节省了空间。所以,如果说对象是用来存放数据与功能的容器,

  那么类则是用来存放多个对象相同的数据与功能的容器。但是需要强调的是:在程序中,必须要事先定义类,然后再调用类产生对象(调用类拿到

  的返回值就是对象)。产生对象的类与对象之间存在关联,这种关联指的是:对象可以访问到类中共有的数据与功能,所以类中的内容仍然是属于

  对象的,类只不过是一种节省空间、减少代码冗余的机制,面向对象编程最终的核心仍然是去使用对象。

三、面向对象编程

    以选课系统为例:

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)

 

  

posted @ 2020-04-07 15:32  三根烦恼丝啊  阅读(106)  评论(0编辑  收藏  举报