python学习第24天面向对象之定义、基本操作、init方法详解、绑定方法

面向过程编程与面向对象编程对比:

(1)面向过程编程:
       核心是过程二字,过程指的是解决问题的步骤,即想干什么再干什么后干什么。。。
       基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维方式

优点:
       复杂的问题流程化、进而简单化
缺点:
        可扩展性差

(2)面向对象编程:
核心是对象二字,对象是特征与技能的结合体

面向对象编程:我们关注的点是.使用什么样的对象可以完成我的任务

优势: 1.对于指挥者(程序员)来说,不需要再关心具体步骤
          2.扩展性,一个单独的个体的特征或行为发生变化时 不会影响到别人

缺点: 1.程序的复杂度变高,你得需要设计这个些对象,注意要避免过度设计得问题
          2.程序得执行结果可控性低

一、定义

(1)什么是对象、类

对象是特征与技能的结合体,类就是一系列对象相似的特征与技能的结合体
站在不同的角度,总结出的类是截然不同的

(2)为什么用对象、类

在现实世界中一定是先有的一个个具体存在的对象,然后随着人类文明地发展而总结出了不同的类
在程序中务必保证先定义类,后调用类来产生对象

(3)对象、类产生过程

现实世界中总结对象-----》抽取相似之处,得到现实世界中的类---》定义为程序中的类-----》调用类,产生程序中的对象

站在老男孩选课系统的角度:
        现实世界中的老男孩学生对象:
                对象1:
                    特征:
                        学校='oldboy'
                        姓名='耗哥'
                        年龄=18
                        性别='male'
                    技能:
                        选课
     
站在老男孩选课系统的角度,先总结现实世界中的老男孩学生类
                老男孩学生类:
                    相似的特征:
                        学校='oldboy'
                    相似的技能
                        选课

二、基本操作

#1、先定义类

class OldboyStudent:                    #驼峰体
school='oldboy'

def choose_course(self):
print('is choosing course')

# 在定义阶段
# 只要包含该类的py被执行 就会做两件事情
# 1.就会创建类的名称空间
# 2.执行代码 将产生的名称放入名称空间

# print(OldboyStudent.__dict__)
# 类本质就是一个名称空间/容器,从类的名称空间中增/删/改/查名字
# python为我们提供专门访问属性(名称空间中的名字)的语法,点后的都是属性
OldboyStudent.school #OldboyStudent.__dict__['school']
OldboyStudent.x=1 #OldboyStudent.__dict__['x']=1
OldboyStudent.school='Oldboy' #OldboyStudent.__dict__['school']='Oldboy'
del OldboyStudent.x #del OldboyStudent.__dict__['x']

# 类中定义的函数是类的函数属性,类可以使用,但使用的就是一个普通的函数而已,意味着需要完全遵循函数的参数规则,该传几个值就传几个
# OldboyStudent.choose_course(123)

#2、后调用类产生对象,调用类的过程称之为实例化,实例化的结果称为类的一个实例或者对象
stu1=OldboyStudent()                # print(stu1)
stu2=OldboyStudent()                # print(stu1)
stu3=OldboyStudent()                # print(stu3)

对象本质也就是一个名称空间而已,对象名称空间是用存放对象自己独有的名字/属性,而类中存放的是对象们共有的属性

三、绑定方法__init__

1、定义

绑定方法是什么?
# 是对象与类中的某个函数的绑定关系像生活中 我们都会吃饭 我吃饭你不会饱那么吃饭就是我自己的绑定方法

2、为什么要绑定 因为对象的行为 通常都需要访问这个对象的数据 或是修改这个对象的数据 如果没有对象

直接调用函数是没有意义的 在函数中访问不到对象的数据 所以将对象和函数进行绑定

3特殊之处
# 在使用绑定方法时 不需要关心self参数 会自动将这个对象本身传进来 
# 对象调用绑定方法时 最后执行的还是类中的那个函数

 
class OldboyStudent:
    school='oldboy'

    def __init__(self, x, y, z): #会在调用类时自动触发
        self.name = x #stu1.name='耗哥'
        self.age = y  #stu1.age=18
        self.sex = z #stu1.sex='male'

    def choose_course(self,x):
        print('%s is choosing course' %self.name)

    def func(self):
        pass

 

__init__方法详解

 class OldboyStudent:
#     school='oldboy'
#
#
#     def __init__(obj, x, y, z): #会在调用类时自动触发
#         obj.name = x #stu1.name='耗哥'
#         obj.age = y  #stu1.age=18
#         obj.sex = z #stu1.sex='male'
#
#     def choose_course(self):
#         print('is choosing course')

1、调用类时发生两件事
#1、创造一个空对象stu1
#2、自动触发类中__init__功能的执行,将stu1以及调用类括号内的参数一同传入

# stu1=OldboyStudent('耗哥',18,'male') #OldboyStudent.__init__(stu1,'耗哥',18,'male')
# stu2=OldboyStudent('猪哥',17,'male')
# stu3=OldboyStudent('帅翔',19,'female')

__init__本质是个功能函数

2、属性查找

先从对象自己的名称空间找,没有则去类中找,如果类也没有则报错

1# 类名称空间中定义的数据属性和函数属性都是共享给所有对象用的
# 对象名称空间中定义的只有数据属性,而且是对象所独有的数据属性

2# 类中定义的函数是类的函数属性,类可以使用,但使用的就是一个普通的函数而已,意味着需要完全遵循函数的参数规则,该传几个值就传几个
# print(OldboyStudent.choose_course)
# OldboyStudent.choose_course(123)

3# 类中定义的函数是共享给所有对象的,对象也可以使用,而且是绑定给对象用的,
#绑定的效果:绑定给谁,就应该由谁来调用,谁来调用就会将谁当作第一个参数自动传入
# print(id(stu1.choose_course))
# print(id(stu2.choose_course))
# print(id(stu3.choose_course))
# print(id(OldboyStudent.choose_course))

PS:

补充:类中定义的函数,类确实可以使用,但其实类定义的函数大多情况下都是绑定给对象用的,所以在类中定义的函数都应该自带一个参数self

 

posted @ 2018-10-22 15:24  凌、云  阅读(156)  评论(0编辑  收藏  举报