本笔记参考视频为:https://www.bilibili.com/video/BV1ex411x7Em?p=101,有兴趣的可以直接移步B站
面向对象编程——Object Oriented Orogramming简写OOP
所有步骤,从头到尾逐步实现类和对象是面向对象编程的两个核心概念
在程序开发中,应该现有类,再有对象
在使用面向对象开发前,应该首先分析需求,确定以下程序中需要包含那些类
以植物大战僵尸游戏为例分析类的设计如下图

在程序开发中,要设计一个类,通常需要满足以下三个要素
名词提炼法:分析整个业务流程,出现的名词,通常就是找到的类
在ipython中快速确认某个东西是对象的方法:
1.在标识符/数据后输一个.,然后按下TAB键,ipython会提示该对象能够调用的方法列表(只能看到一些常用的方法列表)
2.使用内置函数dir传入标识符/数据,可以查看对象内的所有属性及方法

提示:__方法名__格式的方法是Python提供的内置方法/属性,以下是一些常用的内置方法/属性
| 序号 | 方法名 | 类型 | 作用 |
|---|---|---|---|
| 01 | __new__ | 方法 | 创建对象时,会被自动调用 |
| 02 | __init__ | 方法 | 对象被初始化时,会被自动调用 |
| 03 | __del__ | 方法 | 对象从内存被销毁前,会被自动调用 |
| 04 | __str__ | 方法 | 返回对象的描述信息,print函数输出使用 |
语法格式:
class 类名:
def 方法1(self,参数列表):
pass
def 方法2(self,参数列表):
pass
self语法格式:
对象变量 = 类名()
需求:
小猫爱吃鱼,小猫要喝水
分析:
Cateat和drink
# 创建猫类
class Cat:
def eat(self):
print("小猫爱吃鱼")
def drink(self):
print("小猫要喝水")
# 创建一个对象
Tom = Cat()
Tom.drink()
Tom.eat()
结果:

引用概念的强调
在面向对象开发中,引用的概念是同样适用的!
tom变量中仍然记录的是对象在内存中的地址tom变量引用了新建的猫对象print输出对象变量,默认情况下,是能够输出这个变量引用的对象是由哪一个类创建的对象,以及在内存中的地址提示:在计算机中,通常使用十六进制表示内存地址
%d可以以10进制输出数字%x可以以16进制输出数字

.设置一个属性即可以上一节中的代码为例,在创建了小猫对象Tom = Cat()之后,想要从类外部给Tom增加一个姓名属性,可以直接在执行代码出输入Tom.name = "Tom"即可
想要在类内部调用某个属性,可以直接self.属性名
哪一个对象调用的方法,self就是哪一个对象的引用。self类似C++里面的this指针
self就表示当前调用方法的对象自己self函数self.访问对象的属性self.调用其他的对象方法示例:
# 创建猫类
class Cat:
def eat(self):
print("%s 爱吃鱼" % self.name)
def drink(self):
print("%s 要喝水" % self.name)
# 创建一个对象
Tom = Cat()
Tom.name = "Tom"
Tom.drink()
Tom.eat()
结果:


执行上述程序解释器会报错,因为在执行eat()和drink()方法的时候还没有name属性
类名()创建对象时,会自动执行以下操作:
init)__init__方法,__init__是对象的内置方法
__init__方法是专门用来定义一个类具有那些属性的方法
__init__方法内部使用self.属性名=属性的初始值就可以定义属性Cat类创建的对象,都会拥有该属性示例:
# 创建猫类
class Cat:
def __init__(self):
self.name = "Jerry"
def eat(self):
print("%s 爱吃鱼" % self.name)
def drink(self):
print("%s 要喝水" % self.name)
# 创建一个对象
Tom = Cat()
Tom.drink()
Tom.eat()
结果:

__init__方法进行改造
__init__方法的参数self.属性=形参接受外部传递的参数类名(属性1, 属性2...)调用示例:
# 创建猫类
class Cat:
def __init__(self, name_):
self.name = name_
def eat(self):
print("%s 爱吃鱼" % self.name)
def drink(self):
print("%s 要喝水" % self.name)
# 创建一个对象
Tom = Cat("汤姆")
Tom.drink()
Tom.eat()
lazy_cat = Cat("大懒猫")
lazy_cat.drink()
lazy_cat.eat()
结果:

| 序号 | 方法名 | 类型 | 作用 |
|---|---|---|---|
| 01 | __del__ | 方法 | 对象被从内存中销毁前,会被自动调用 |
| 02 | __str__ | 返回对象的描述信息,print函数输出使用 |
类名()创建对象时,为对象分配空间后,自动调用__init__方法__del__方法__init__改造初始化方法,可以让创建对象更加灵活__del__如果希望在对象销毁前,再做一些事情,可以考虑以下该方法类名()创建,生命周期开始__del__方法一旦被调用,生命周期结束示例:
# 创建猫类
class Cat:
def __init__(self, name):
self.name_ = name
print("%s 来了" % self.name_)
# 定义析构函数
def __del__(self):
print("%s 走了" % self.name_)
# 创建一个对象
tom = Cat("Tom")
print(tom.name_)
print("-" * 20)
结果:

分析:
tom是一个全局变量,只有在整个程序结束之后才会被销毁,因此会先打印----------,在执行析构函数中的语句
Python中有一个关键字
del,可以直接销毁变量,若在打印-------之前销毁tom变量,则会先执行析构函数中的语句,代码如下:
# 创建猫类
class Cat:
def __init__(self, name):
self.name_ = name
print("%s 来了" % self.name_)
# 定义析构函数
def __del__(self):
print("%s 走了" % self.name_)
# 创建一个对象
tom = Cat("Tom")
print(tom.name_)
del(tom)
print("-" * 20)
结果:

print输出对象变量,默认情况下,会输出这个变量引用的对象是由哪一个类创建的对象,以及在内存中的地址(十六进制表示)[见3.2.3]print输出对象变量时能够打印自定义的内容,就可以利用__str__这个内置方法了注意:
__str__方法必须返回一个字符串
# 创建猫类
class Cat:
def __init__(self, name):
self.name_ = name
print("%s 来了" % self.name_)
# 定义析构函数
def __del__(self):
print("%s 走了" % self.name_)
def __str__(self):
# 必须返回一个字符串
return "我是小猫 %s" % self.name_
# 创建一个对象
tom = Cat("Tom")
print(tom)

如上例,在使用
tom时,输出了__str__中返回的内容
需求
75.0公斤
示例:
class Person:
def __init__(self, name, weight) -> None:
self.name_ = name
self.weight_ = weight
def __str__(self) -> str:
return "我的名字是 %s,我的体重是 %.2f 公斤" % (self.name_, self.weight_)
def run(self):
print("跑步好,跑步减肥")
self.weight_ -= 0.5
def eat(self):
print("没吃饱哪有力气减肥")
self.weight_ += 1
xiaoming = Person("小明", 75.0)
xiaoming.eat()
xiaoming.run()
print(xiaoming)
结果:

需求:
示例:
class Person:
def __init__(self, name, weight) -> None:
self.name_ = name
self.weight_ = weight
def __str__(self) -> str:
return "我的名字是 %s,我的体重是 %.2f 公斤" % (self.name_, self.weight_)
def run(self):
print("跑步好,跑步减肥")
self.weight_ -= 0.5
def eat(self):
print("没吃饱哪有力气减肥")
self.weight_ += 1
xiaoming = Person("小明", 75.0)
xiaoming.eat()
xiaoming.run()
print(xiaoming)
xiaomei = Person("小美", 45.0)
xiaomei.eat()
xiaomei.run()
print(xiaomei)
结果:

需求
