共计 3397 个字符,预计需要花费 9 分钟才能阅读完成。
一、面向对象思想简介
- 软件编程就是将我们的思维转变成计算机能够识别语言的一个过程
-
什么是面向过程?
自上而下顺序执行,逐步求精
其程序结构是按功能划分为若干个基本模块,这些模块形成一个树状结构;
各模块之间的关系尽可能简单,在功能上相对独立
每一模块内部均是由顺序、选择和循环三种基本结构组成
其模块化实现的具体方法是使用子程序
程序流程在写程序时就已决定
-
什么是面向对象?
把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象
对同类对象抽象出其共性,形成类
类中的大多数数据,只能用本类的方法进行处理
类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信
程序流程由用户在使用中决定
-
理解面向对象
-
面向对象是相对面向过程而言
-
面向对象和面向过程都是一种思想
-
面向过程
强调的是功能行为
关注的是解决问题需要哪些步骤 -
面向对象
将功能封装进对象,强调具备了功能的对象
关注的是解决问题需要哪些对象 -
面向对象是基于面向过程的
-
-
把? 关冰箱
面向过程
面向对象:更加符合人民思考习惯的思想,从执行者变成了指挥者
-
面向对象的特点
是一种符合人们思考习惯的思想
可以将复杂的事情简单化
将程序员从执行者转换成了指挥者
-
完成需求时
a、先要去找具有所需的功能的对象来用
b、如果该对象不存在,那么创建一个具有所需功能的对象
-
类与对象的关系
使用计算机语言就是不断的在描述现实生活中的事物
Python 中描述事物通过类的形式体现,类是具体事物的抽象,概念上的定义
对象即是该类事物实实在在存在的个体
-
面向对象的 4 大特性
封装、继承、多态、抽象
二、第一个 Python 类
-
设计类只关心 3 样东西
-
说明
类名:首字母大写,遵守标识符规则
属性:遵守标识符规则
行为(功能、方法、函数):遵守标识符规则 -
设计类
类名:Person 属性:name age sex height weight 行为:搬砖、盖房子
-
-
创建类
-
格式
class 类名(父类名): 属性 & 行为
-
说明
class:表明这是一个类
类名:类的名字
():父类集合的开始和结束
父类名:父类的名字,定义的类继承自父类,可以不写,默认是 object。object 是所有类的直接或间接父类
-
代码
class Person(object): pass
-
三、使用类实例化对象
# 类
class Person(object):
pass
-
格式
对象名 = 类名(参数列表)
-
说明
参数列表:为了后面给属性进行赋值的
-
实例化代码
per1 = Person() print(per1) per2 = Person() print(per2)
四、访问对象的方法
-
对象方法
定义:如 Person 类中
调用方式:通过实例对象调用
调用格式:对象名. 方法名(参数列表)
特性:在对象方法内部可以引用类内部的任何属性和方法
注意:定义对象方法的第一个参数必须是 self,其余参数按顺序排列,调用对象方法(函数)时忽略 self
self:代表一个对象,哪个对象调用的对象方法,那么在该方法中 self 就代表哪个对象
-
类方法
定义:如 Person 类中
调用方式:用类名调用(也可以使用对象调用,但是很少这么用)
调用格式:类名. 方法名(参数列表)
特性:在类方法内部可以引用类的属性和方法
注意:定义对象方法的第一个参数必须是 cls,其余参数按顺序排列,调用类方法(函数)时忽略 cls
cls:代表当前对象的类的类名
-
静态方法
定义:如 Person 类中
调用方式:类和实例对象均可调用
调用格式:类名 / 对象名. 方法名(参数列表)
特性:无论用类调用还是用实例对象调用,都无法获取到内部的属性和方法,完全独立的一个方法
作用:常用作工具方法
-
代码
class Person(object): # 定义对象方法 def run(self): print("----------------run", self) # 对象方法内部调用其他对象方法 self.eat("banana") # 对象方法内部调用其他类方法 self.talk("nice") def eat(self, food): print("----------------eat", food) # 定义类方法 @classmethod def say(cls): print("----------------say", cls) # 在类方法内部调用其他类方法 cls.talk("handsome") @classmethod def talk(cls, word): print("----------------talk", word) # 定义静态方法 @staticmethod def play(): print("----------------play") # 实例化一个对象 per = Person() print(per) print(Person) # 调用对象方法 per.run() per.eat("apple") # Person.run() #报错 # Person.run(per) #类调用对象方法,需要传递一个对象,实参对象会给对象方法中的 self 赋值。注意帅的人基本不这么用 # 调用类方法 Person.say() Person.talk("good") # per.say() #使用实例对象调用了类方法,最好不要这么用 print("-------------------------------") per.run() Person.say() print("-------------------------------") per.play() Person.play()
五、类属性
-
定义
class Person(object): # 定义类属性 # 当多个类的对象的属性值需要相同时可以使用类属性 name = "lilei" age = 18 sex = "男"
-
调用
可以通过类调用,也可以通过对象调用
-
使用
# 实例化对象时,每一个对象的属性值都相同 per1 = Person() per2 = Person() # 通过对象方法类属性 对象名. 类属性名 print(per1.name, per1.age, per1.sex) print(per2.name, per2.age, per2.sex) # 修改对象属性值,如果对象属性不存在则变为增加对象属性 per1.name = "liudh" per2.name = "daol" print(per1.name, per2.name, Person.name)
-
问题
使用类创建的所有对象的属性初始值都是一样的
六、对象的初始化状态
-
需求
类创建的多个对象的属性的初始值是不同的
-
定义
class Person(object): # 类属性 country = "中国" # 构造方法:在使用类创建实例对象时自动调用,目的是初始化对象的内容 def __init__(self, name, age, sex): # 定义对象属性 # 只能对象调用 self.name = name self.age = age self.sex = sex
-
使用
# 创建对象时给每个对象的属性进行赋值 per1 = Person("daol", 45, "男") per2 = Person("liudh", 55, "男") print(per1.name) print(per2.name) # print(Person.name) # 类中没有 name 属性,且类无法调用对象属性
-
__new__
方法说明:是一个类方法,在使用类实例化对象时,在
__init__
之前调用,在堆内存中开辟空间,并返回空间的首地址,该片内存空间就代表创建的对象(混沌对象)使用:以后是使用
__new__
实现单例类,否则基本不会使用class Person(object): # 类属性 country = "中国" def __new__(cls, *args, **kwargs): return super().__new__(cls) def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex
七、析构函数
-
作用
释放一些不必要的内存
-
使用
class Person(object): def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def __del__(self): print("-----del-----")
-
调用:在释放对象时自动调用
per = Person("liudh", 55, "男") # 释放对象 del per print(per) # num = 10 # #释放掉后面的内容 # del num # print(num)