面向对象
相比较于函数,面向对象是更大的封装,根据职责在一个对象中封装多个方法
1.在完成某一个需求前,首先要确定职责——就是要做的事情(方法)
2.根据职责确定不同的对象,在对象内部封装不同的方法
3.最后完成的代码,就是顺序地让不同的对象调用不同的方法
特点
1.注重对象和职责,不同的对象承担不同的职责
2.更加适应对复杂的需求变化,是专门对复杂项目的开发,提供固定的套路
类 和 对象 是面向对象编程的 两个 核心概念
类
类 是对一群具有相同特征 或 行为 的事物的统称, 是抽象的, 不能直接使用
特征被称为属性
行为被称为方法
类 相当于一个模板,是负责创建对象的
在程序开发中,要设计一个类,通常需要满足以下三个要素:
1.类名这类事物的名字需要满足 大驼峰命名法
2.属性这类事物具有什么样的特征
3.方法这类事物具有什么样的行为
大驼峰命名法
1.首先每一个单词的首字母大写
2.单词与单词之间没有下划线
类名的确定
名词提炼法 分析 整个业务流程, 出现的 名词, 通常就是找到的类
属性和方法的确定
对 对象的特征描述,通常可以定义为属性
对象具有的行为(动词),通常可以定义为方法
**提示:**需求中没有涉及的需求或方法在设计类时,不需要考虑
dir内置函数
在python中要定义一个只包含方法的类,语法格式如下:
class 类名:
def 方法1(self, 参数列表):
pass
def 方法2(self, 参数列表):
pass
方法的定义格式和之前学习的函数 几乎一样
区别在于第一个函数必须是 self,
**注意:**类名的命名规则要符合大驼峰命名法
创建对象
当一个类定义完成之后,要使用这个类来创建对象,语法格式如下:
对象变量 = 类名()
引用概念的强调
在面向对象开发时, 引用的概念是同样适用的
在 python 使用类创建对象之后,变量中仍然记录的是 对象在内存中的地址
也就是变量引用了新建的猫对象
使用 print 输出变量对象,默认情况下,是能够输出这个变量 引用的对象 是 有哪一个类创建的对象, 以及 在内存中地址(十六进制数表示)
使用 self 方法
由 哪一个对象 调用的方法, 方法内的 self 就是哪一个对象的引用
在类封装的方法内部, self 就表示 当前调用方法的对象自己
调用方法时, 程序员不需要传递 self 参数
在方法内部
可以通过 self. 访问对象的属性
也可以通过 self. 调用其他的对象方法
初始化方法
当使用 **类名()**创建对象时,会自动执行以下操作:
1.为对象在内存中 分配空间——创建对象
2.为对象的属性 设置初始值——初始化方法(init)
这个初始化方法就是 __init __方法,__init __就是对象的内置方法
__init __方法是专门用来定义一个类 具有哪些属性的方法!!!
在初始化方法内部定义属性
在 __ init__方法内部使用 self.属性名 = 属性的初始值 就可以定义属性
定义属性之后,在使用类创建对象,都会拥有该属性
改造初始化方法——初始化的同时设置初始值
在开发中,如果希望在创建对象的同时,就设置对象的属性,可以对__init __方法进行改造
1.把希望设置的初始值定义为__init __方法的参数
2.在方法内部使用 self.属性 = 形参 接收外部传递的参数
3.在创建对象时,使用 **类名(属性1, 属性2…)**调用
内置方法和属性
序号 | 方法名 | 类型 | 作用 |
---|---|---|---|
01 | __del __ | 方法 | 对象被从内存中销毁前,会自动调用 |
02 | __str __ | 方法 | 返回对象的描述信息,print 函数输出使用 |
__del __方法
在 python 中
使用 类名()创建对象时,为对象分配完空间后,会自动调用__init __ 方法
当一个对象被从内存中销毁前,会自动调用 __del __方法
生命周期
一个对象从调用 类名() 创建,生命周期开始
一个对象的 __del __方法一旦被调用,生命周期结束
在对象的生命周期内,可以访问对象属性,或者让对象调用方法
__str __方法
在 python 中,使用 print 输出对象变量,默认情况下,会输出这个变量是由哪一个类创建的对象,以及在内存中的地址(十六进制表示)
如果在开发中,希望使用 print 输出变量使用时,能够打印自定的内容,就可以利用 __str __ 这个内置方法了
注意:__str __ 方法必须返回一个字符串
例:
class Cat:
def __init__(self, new_name):
self.name = new_name
print("% s 来了" % self.name)
def __del__(self):
print("% s 走了" % self.name)
def __str__(self):
return "我是小猫 % s" % self.name
tom = Cat("Tom")
print(tom)
1.封装是面向对象编程的一大特点
2.面向对象编程的第一步——将 属性 和 方法 封装到一个抽象的 类 中
3.外界使用类创建对象,然后让对象调用方法
4.对象方法的细节都被封装在类的内部
提示:
1.在对象的方法内部,是可以直接访问对象的属性的
2.同一个类中创建的多个对象之间,属性互不干扰
定义没有初始值的属性
在定义属性时,如果不知道设置什么初始值,就可以设置为 None
None关键字表示什么也没有
表示一个空对象,没有方法和属性,是一个特殊的常量
可以将None赋值给任何一个变量
身份运算符
身份运算符用来比较两个对象的 内存地址 是否一致——是否对同一个对象的引用
在python中针对None比较时,建议使用is判断
运算符 | 描述 | 实例 |
---|---|---|
is | is 是判断两个标识符是不是引用同一个对象 | x is y,类似于id(x)== id(y) |
is not | is not是判断两个标识符是不是引用不同对象 | x is not y,类似于id(x)!= id(y) |
is 与 == 区别
is 用于判断 两个变量 引用对象是否为同一个
== 用于判断 引用变量的值 是否相同