类和面向对象编程day19

面向对象基础

  1. 什么是面向对象?

    指的是一门编程思想

​ 面向过程编程:

​ 核心是‘过程’二字,过程指的是做事情的步骤,即先做什么再做什么

​ 基于该编程思想编写程序,就好比一条工厂流水线,一种机械式的思维方式。

​ 优点:

​ 逻辑清晰,复杂的问题流程化,进而简单化。

​ 缺点:

​ 可扩展性差。

​ 面向对象编程:

​ 核心是‘对象’二字,对象指的是特征与技能的结合体。

​ 基于该编程思想编程,就好比创造世界,一种上帝式的思维方式。

​ 优点:

​ 可扩展性高。

​ 缺点:

​ 编写程序的复杂程度要远高于面向过程编程

​ 优先使用面向过程还是面向对象?

​ 面向过程结合面向对象一起使用。

​ 选课系统项目

如何造对象?首先学习类

什么是类?

​ 类型、类别、分类

​ 先定义类、后调用类产生对象

-在现实世界中:

​ 对象是一个个具体存在的事物,类是由人类文明的发展抽象总结出来的。

-在程序中:

​ 必须遵循,先有类,再有对象

如何定义类:

​ 1.先从现实世界中,基于一个个的对象,抽取出来

​ 2.再定义类。

##### 类:对象是特征与技能的结合体,类是一系列对象相同的特征与技能的结合体

先定义类、后调用类产生对象
学生对象1:

​           特征:

​               school

​               name

​               ege

​               sex

​           技能:

​               learn

​               choice

​ 定义类的语法:

def 函数名()

class 类名:
    对象相同的特征
    对象相同的技能
    
class: 用来定义类的,class后跟的是类名。
类名:类的名字,用来调用创造对象的。
注意:类名必须要遵循驼峰命名法,
python在定义变量与函数时不推荐使用,但在定义类时推荐使用。

在定义类发生得到事情:
    1.类在定义时,会产生一个类的名称空间。
    2.会把类内部所有名字,扔进类的名称空间中
    
    注意:类在定义阶段就已经产生好了名称空间,执行python文件时会执行类的内体代码
学生类:
    相同特征-->类内部的变量
        school
    相同技能-->类内部的函数
        learn
        choose_course
        
class OldboyStudent:
    school = 'oldboy'
    
    def learn(self): # self对象自己
        print('learn python')
        
    def choose_course(self):
        print('choose course')
      
OldboyStudent -->会指向类的名称空间
print(OldboyStudent) 地址
print(OldboyStudent.__dict__) 查看类的名称空间中所有名字(以key:value形式存在字典中)
print(OldboyStudent.__dict__.get('school')) # oldboy
查
print(OldboyStudent.__dict__.get('school'))

#改
#OldboyStudent.__dict__['school']='oldgirl'
#print(OldboyStudent.__dict__.get('school'))
#报错 只能读,不能增删改
 
类.特征或技能的方式对类内部的名字进行修改
'.'会指向类内部的名称空间,从而获取名字
# 查
print(OldboyStudent.school) # oldboy
# 改
OldboyStudent.school ='oldgirl'
print(OldboyStudent.school)
# 增
OldboyStudent.address = '上海'
print(OldboyStudent.address) # 特征也称之为属性
# 删除
del OldboyStudent.address
OldeboyStudent.choose_course(123)# 调用技能

以上是类的所有操作

如何产生对象:
   语法:
       类名 + ()调用类产生对象
       
名称空间的产生:
   1.类的名称空间在类定义阶段就已经产生了。
   2.对象的名称空间,在调用类时产生。

OldboyStudent()#得到一个学生对象地址        
stu1 = OldboyStudent()#赋值给变量,实体
stu2 = OldboyStudent()
stu3 = OldboyStudent()
# .指向对象名称空间
print(stu1.school)
stu1.learn()
print(stu2.school)
stu2.learn()
print(stu3.school)
stu3.learn()

问题:对象与对象之间的特征与技能一样。
解决:在类内部定义__init__函数
__init__:会在调用类时,自动触发该函数# 为对象初始化某些属性 
    def __init__(self):#self 对象本身
        
调用类发生的事情:
    1.首先会产生一个空的对象, 就是产生'对象的名称空间'
    2.会自动触发__init__.
    3.会把对象本身以及括号内的参数一并传给__init__函数。#stu3 = OldboyStudent()  
    
    若__init__中有self以外的参数,调用类时必须在括号内传入参数
    def __init__(self,x,y,z)
stu1 = OldboyStudent('zzx',23,'male')
        
#给对象添加属性一
stu1.name = 'zzx'
print(stu1.name)
#给对象添加属性二
    def __init__(self,x,y,z)
    self.name = x
    self.age = y
    self.sex = z 
stu1 = OldboyStudent('zzx',23,'male') 
print(stu1.name)
    

对象与类的查找顺序

对象查找特征优先自己的,然后找类的,没有则报错。

对象绑定方法的特殊之处

类内部的函数主要是给对象用的

  1. 由类来调用类内部的函数,该函数只是一个普通的函数,普通函数需要接收几个参数就得传入几个参数。
  2. 由对象来调用的函数称之为对象的绑定方法,不同的对象调用该绑定方法,则会将不同的对象传入该绑定方法中。
print(OldboyStudent.learn) # function
OldboyStudent.learn(123)

stu1 = OldboyStudent('zzx',23,'male')# 实例一个对象
stu1.learn()# 不用参数,stu1当作第一个参数传给了self
 #对象之间与类的方法功能是一样的
OldboyStudent.learn(123)
stu1.learn()
# 内存地址不一样
print(OldboyStudent.learn)
print(stu1.learn)# 绑定了

Python中一切皆对象

上一篇:【最大流,dinic】P2055 [ZJOI2009]假期的宿舍


下一篇:【INDEX】【前端】学习汇总