一、什么是面向对象
面向对象是一种编程思想,是前辈们总结出来的经验,指导程序员如何编写出更好的程序。
核心是对象,程序就是一系列对象的集合,程序员负责调度控制这些对象来交互着完成任务。
对象不是凭空产生的,需要我们自己设计
面向对象的三大优点:1.扩张性强 2.灵活性高 3.重用性高
缺点:1. 程序的复杂度提高了 2.无法准确的预知结果
使用场景:对扩展性要求较高的程序,通常是直接面向用户的,例如:qq,微信
二、面向过程编程思想
关注的核心是过程,过程就是一步一步的执行步骤,即先干啥后干啥。
优点:逻辑清晰,复杂问题简单化,流程化
缺点:扩展性差,可维护性差
使用场景: 对扩展性要求较低的程序 例如:系统内核,git,计算机
注意:不是所有程序都是要面向对象的,需要具体分析。
三、类和对象 这是oop中的最核心的两个概念
类:即类型,类别,是一种抽象概念 是一系列具备相同特征和相同行为的对象的集合。比如:人类,汽车
对象:就是具体存在的某个事物 具备自己的特征和行为 对象就是特征和技能的结合体。
类和对象的关系:
类包含一系列对象
对象属于某个类
在生活中先有对象再有类 (比如先有各个人,然后在一起就有了人类的称呼)
在程序中是先有类才能有对象,但是我们必须先告诉计算机这类的对象有什么特征有什么行为。
总结结论:在使用面向对象编程时,第一步就是思考需要什么样的对象,对象具备什么特征和行为,从而根据这些信息总结出需要的类型。
四、创建类和对象
定义类的语法
class 类的名称: #类的内容 描述属性和技能 #描述属性用变量 #描述行为用函数 #类名称 书写规范 首先是见名之意 名称是大驼峰命名法 #驼峰就是单词首字母大写
创建对象的语法: 下面的p就是对象 对象名 = 类名()
class Person: pass #创建对象 p = Person()
属性的写法:
属性可以写在类中 类中的属性,是所有对象公共的 也可以写在对象中 对象中的属性,是每个对象独特的(不一样的) 如果类中和对象中存在同样的属性,先访问对象的属性,如果没有再访问类中的属性 例题:描述一个老师类,需要包含一个公共属性和一个独特的属性 class Teacher: school = 'oldgirl' #这个是类的属性 t1 = Teacher() t1.name = 'jack' #对象中的属性 t1.age = 18
属性的增删改查:
增加属性: 对象变量名称.属性名称 = 属性值 删除属性: del 对象的变量名称.属性名称 修改 对象.属性 = 新的值 查 访问对象的所有属性 print(对象.__dict__) 访问对象的类信息 print(对象.__class__)
五、__init__方法
这个叫初始化方法,本质上就是一个函数 功能:用户给对象赋初始值
特点1:当实例化对象时,会自动执行init方法
特点2:会自动将对象作为第一个参数传入,参数名称为self,self可以是别的名字,但不建议改
练习:创建一个类具备几个属性,通过初始化方法来给他们设置属性
class Dog: def __init__(self,kind,color,age): #这个self就相当于对象,假如对象是d1,这个self就是d1,当做第一个参数 self.kind = kind self.color = color #这个slef.kind也可以写成别的名称,但是等号后面的就是上面传下来的值,不能改 self.age = age d1 = Dog("二哈","黑白",1) d2 = Dog("泰迪","棕色",2)
需要特别注意的是:在__init__中不能写返回值,只能是None
对象的精髓就是将数据和处理数据的函数整合到一起,这样一来拿到一个对象就同时拿到了需要处理的数据以及处理数据的函数。
初始化方法的简便写法:这个self是对象,__dict__是获取到对象所有的属性名和函数名,locals是所有局部变量。
六、绑定方法(重点!!!需要认真区分出什么情况下使用)
1、对象绑定方法
默认情况下类中的方法都是对象绑定方法,调用函数的时候可以不用传参。
其特殊之处在于,当使用对象调用函数时会自动传入对象本身,作为第一个参数。
当使用类名调用函数的时候就是一个普通函数,有几个参数就得传几个参数。(传值可以传对象或者具体的值)
对象绑定方法中,对象调用函数的使用方法:
class Dog: def __init__(self,kind,color,age): self.kind = kind self.color = color self.age = age def run(self): #默认情况下这个self就是传进来的d1对象 print('%s在跑'%self.kind) #使用对象.属性的方式获取属性值 d1 = Dog("二哈","黑白",1) d2 = Dog("泰迪","棕色",2) d1.run() #二哈在跑 #对象调用函数,不用传参
对象绑定方法中,类调用函数的使用方法:
class Dog: def __init__(self,kind,color,age): self.kind = kind self.color = color self.age = age def run(self): print('%s在跑'%self.kind) d1 = Dog("二哈","黑白",1) d2 = Dog("泰迪","棕色",2) Dog.run(d2) #泰迪在跑 #类调用函数的方法,这里run方法需要一个对象,所以把d2对象传进去
class Dog:
def __init__(self,kind,color,age):
self.kind = kind
self.color = color
self.age = age
def run(name):
print('%s在跑'%name)
d1 = Dog("二哈","黑白",1)
d2 = Dog("泰迪","棕色",2)
Dog.run('金毛') #类调用函数的方法,这里run函数传一个具体值进去也可以
2、类绑定方法 类绑定方法用@classmethod来装饰
特殊之处:不管用类还是对象调用,都会自动传入类本身,作为第一个参数传入
这两种方式调用函数都不用传参,都会默认传入类对象本身
#类调用函数方法
class Dog: name = '狼狗' def __init__(self,kind,color,age): self.kind = kind self.color = color self.age = age @classmethod def run(cls): print('%s在跑'%cls.name) d1 = Dog("二哈","黑白",1) d2 = Dog("泰迪","棕色",2) Dog.run() #狼狗在跑 因为会自动传入类的本身,所以对象里面的属性用不了,只能用类里面的属性,比如这个用不到kind,color,age这几个属性
#对象调用函数方法
class Dog:
name = '狼狗'
def __init__(self,kind,color,age):
self.kind = kind
self.color = color
self.age = age
@classmethod
def run(cls):
print('%s在跑'%cls.name)
d1 = Dog("二哈","黑白",1)
d2 = Dog("泰迪","棕色",2)
d1.run() #只能使用类里面的函数
总结:
什么时候使用对象绑定方法:当函数逻辑需要访问对象中的数据时
什么时候使用类绑定方法:当函数逻辑需要访问类中的数据时
3、非绑定方法
或叫做静态方法,就是既不需要访问类的数据,也不需要访问对象的数据
语法:@staticmethod 不常用
#python为类内置的特殊属性 类名.__name__# 类的名字(字符串) 类名.__doc__# 类的文档字符串 类名.__base__# 类的第一个父类(在讲继承时会讲) 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲) 类名.__dict__# 类的字典属性 类名.__module__# 类定义所在的模块 类名.__class__# 实例对应的类(仅新式类中)