一、基本概念
01、面向对象的基本概念
面向对象和面向过程是不同的编程方法
1.1过程和函数
1.2 面向过程和面向对象
1)面向过程
面向过程的特点
2)面向对象
特点:
eg:面向对象就是将不同的功能分配在一个个实体中,只要将实体放在大的程序框架中,实体负责实现自己的职责就好,例如植物大战僵尸中的向日葵就是一个对象,将向日葵需要做的职责:生产阳光、摇晃,以及拥有的生命值的属性,封装在他的内部,只要将向日葵放在地上,他就会执行自己的职责,同理,僵尸豌豆射手也有自己的属性和职责,将他们放在一起各自执行自己的职责就可以让整个游戏顺利的进行下去。
二、类和对象
01、基本概念
1.1类
类是对一群具有相同特征(属性)和行为(方法)的事物的统称,是抽象的,不能直接使用
类相当于建造实体的图纸,不能直接使用,但可以依据它创建不同的对象
1.2对象
对象是由类创造出来的具体存在,是可以直接使用的,由某一个类创造出来的对象就拥有该类的属性和方法
对象就是有图纸建造出来的实体
02、类和对象的关系
03、类的设计
在面向对象编程前,需要分析需求,确定程序中需要包括哪些类
在程序开发的过程中,要设计一个类需要满足以下三个要素:
3.1类名的确定
在整个业务流程中提炼名词,这一般就是要创建的类
3.2属性和方法的确定
三、面向对象基础语法
01、dir函数
在python中可以使用两个方法验证对象
__方法名__格式的方法是python提供的内置方法/属性,
方法名 | 类型 | 作用 |
__new__ | 方法 | 创建方法时,会被自动调用 |
__init__ | 方法 | 对象被初始化时,会被自动调用 |
__del__ | 方法 | 对象被内存销毁前,会自动调用 |
__str__ | 方法 | 返回对象的描述性息,print函数输出使用 |
02、定义简单的类(只包含方法)
2.1定义只包含方法的类
class 类名:
def 方法1(self,参数1):
pass
def 方法2(self,参数2):
pass
方法的定义格式和之前学习的函数几乎一样,区别在于第一个参数必须是self
2.2 创建对象
当一个类创建完成后,就可以用这个类来创建对象:
对象名 = 类名()
2.3创建一个面向对象的程序
需求:小猫爱吃鱼,小猫要喝水
分析:名词小猫——类
动词吃鱼、喝水——方法
# 创建猫类 class Cat: def eat(self): print("小猫爱吃鱼") def drink(self): print("小猫要喝水") # 创建tom对象 tom = Cat() tom.eat() tom.drink() """输出结果: 小猫爱吃鱼 小猫要喝水"""
在python中创建对象之后,tom变量仍然记录的是对象在内存中的地址,即tom变量引用了新建的猫对象,可以使用print函数输出对象变量,一般会输出对象变量的类和其内存地址(16制)
在python中使用格式化输出%d输出的是10进制数字,%x输出的是16进制的数字
进阶:再创建一个对象,虽然都是Cat类创建的对象,但他们是不同的对象
lazy_cat = Cat() lazy_cat.drink() lazy_cat.eat()
03、方法中的self参数
3.1给上述案例增加属性
给对象增加属性很简单但不推荐使用
只需要在对象名后通过 . 设置一个属性就可以了
tom = Cat() tom.name = "tom" ...... lazy_cat = Cat() lazy_cat.name = "lazycat"
3.2 使用self在方法内部输出每一只猫的名字
注意:由哪一个对象调用方法,方法内的self就是哪一个对象的引用
class Cat: def eat(self): print("%s爱吃鱼" % self.name) def drink(self): print("%s要喝水" % self.name) ......
"""输出结果: tom爱吃鱼 tom要喝水 <__main__.Cat object at 0x0000023BE746B358> lazy_cat要喝水 lazy_cat爱吃鱼 <__main__.Cat object at 0x0000023BE74ECBE0>"""
在类的外部,通过变量名. 访问对象的属性和方法‘
在类的内部,通过self. 访问对象的属性和方法
04,初始化方法
4.1、在类的外部增加属性的弊端
在类的外部增加属性,在日常的编写中不推荐使用,因为在运行时如果没有找到这个属性,程序会报错
所以应该在类内部封装对象的所有属性
4.2 初始化方法
初始化方法__init__,是对象的内置方法,专门用来定义一个类拥有哪些属性的
初始化方法在调用函数时,会被自动调用
class Cat: def __init__(self): print("这是一个初始化方法") tom = Cat() """输出结果: 这是一个初始化方法"""
4.3在初始化方法内部定义属性
在__init__方法内部使用self.属性名= 属性的初始值 就可以定义属性
在定义属性之后,在使用类创建的对象就拥有了该属性
class Cat: def __init__(self): self.name = "tom" def eat(self): print("%s 爱吃鱼" % self.name) tom = Cat() tom.eat() """输出结果: tom 爱吃鱼 """
4.4 初始化的同时设定初始值
类中的属性创立其实和函数的创立是很相似的,所以,也可以给初始化方法加入形参,以接受外部的实参,就可以在创建对象时,设置不同对象的参数
在创建对象时,使用类名(属性1,属性2....)调用
class Cat(): def __init__(self,name): self.name = name def eat(self): print("%s 爱吃鱼" % self.name) tom = Cat("tom") tom.eat() lazy_cat = Cat("大懒猫") lazy_cat.eat() """输出结果: tom 爱吃鱼 大懒猫 爱吃鱼 """
05、内置方法和属性
5.1__del__方法
__del__方法是希望对对象被销毁前,再做一些事情的时候,可以使用__del__方法
对于一个对象来说其生命周期从调用类名()开始,到调用__del__方法结束
class Cat(): def __init__(self,name): self.name = name def eat(self): print("%s 爱吃鱼" % self.name) def __del__(self): print("%s离开了" % self.name) tom = Cat("tom") tom.eat() lazy_cat = Cat("大懒猫") lazy_cat.eat() """输出结果: tom 爱吃鱼 大懒猫 爱吃鱼 tom离开了 大懒猫离开了 """
__del__方法会在所有的代码执行完成之后,最后自动调用
5.2 __str__方法
在python中使用print输出对象变量,实际上会输出引用的对象是由哪一个类创建的对象,以及在内存中的地址(十六进制表示),在开发中,希望使用print输出变量时,打印自定义的内容,就可以使用__str__方法
注意:__str__方法必须返回一个字符串
class Cat(): def __init__(self,name): self.name = name def __str__(self): return "我是小猫 %s " % self.name tom = Cat("tom") print(tom) """输出结果:我是小猫tom"""