1.python-面向对象
1. 概述
1.1 面向过程
定义:分析出解决问题的步骤,然后逐步实现。
例如:婚礼筹办
-- 请柬(选照片、措词、制作)
-- 宴席(场地、找厨师、准备桌椅餐具、计划菜品、购买食材)
-- 仪式(定婚礼仪式流程、请主持人)

1.2 面向对象
定义:找出解决问题的人,然后分配职责。
例如:婚礼筹办
-- 发请柬:找摄影公司(拍照片、制作请柬)
-- 宴席:找酒店(告诉对方标准、数量、挑选菜品)
-- 婚礼仪式:找婚庆公司(对方提供司仪、制定流程、提供设备、帮助执行)
2 类和对象
2.1 抽象
(1) 从客观事物中抽离出共性、本质,舍弃个别、非本质的过程。
(2) 类:抽象的概念,即生活中的"类别"。
--数据:车牌号、颜色、品牌...
--行为:计费
(2) 对象:具体的实例,即归属于某个类别的"个体"。
--数据:京C007、白色、奔驰
2.2 语法
2.2.1 定义类
class Taxi: # 类的所有首字母大写 def __init__(self, color="", speed=""): # __init__方法也叫构造函数,创建对象时调用,可以省略 # self变量绑定的是被创建的对象,可指定任意名字 self.color = color self.speed = speed def charging(self): print("计费中")
2.2.2 实例化对象
# 实例化对象(具体化) 自动调用__init__ # 语法:对象名 = 类名(数据) # 对象名存储的是实例化后的对象地址 bc = Taxi("白色", "100码") # 类名后面的参数按照构造函数的形参传递 # color与speed称为实例变量 print(bc.color) # 白色 print(bc.speed) # 100吗 bc.charging() # python内置实例变量(自定义对象可以使用) # {实例变量名:实例变量值} print(bc.__dict__) # {'color': '白色', 'speed': '100码'} bm = Taxi("黑色", "200码") print(bm.color) bm.charging()
2.2.3 静态方法
# 静态方法 # (1) 定义:@staticmethod # (2) 调用:类名.方法名称(参数) # (3) 说明 # -- 使用@staticmethod修饰的目的是该方法不需要隐式传参数。 # -- 静态方法不能访问实例成员 # (4) 作用:定义常用的工具函数。 class Taxi: # 类的所有首字母大写 def __init__(self, color="", speed=""): # __init__方法也叫构造函数,创建对象时调用,可以省略 # self变量绑定的是被创建的对象,可指定任意名字 self.color = color self.speed = speed def charging(self): print("计费中") @staticmethod # 定义静态方法 def carry_passenger(num): print("这趟运了%s位乘客" % num) Taxi.carry_passenger(3) # 调用静态方法
3 继承
3.1 定义
(1) 概念: 重用现有类的功能,并在此基础上进行扩展。
(2) 说明:子类直接具有父类的成员(共性),还可以扩展新功能。
(3) 相关知识
-- 父类(基类、超类)、子类(派生类)。
-- 父类相对于子类更抽象,范围更宽泛;子类相对于父类更具体,范围更狭小。
--单继承: 父类只有一个(例如Java, C#)
--多继承: 父类有多个(例如C++, Python)
3.2 继承方法
class People: def __init__(self, name="", sex="", age=""): self.name = name self.sex = sex self.age = age def study(self): print("学无止境") def speak(self): print("理解与沟通") class Student(People): # 继承People类,python中可以有多个父类 def study(self): # 重写父类的方法study # super().study() # 在子类的方法中可以通过超类super()调用父类的方法 print("学习是学生的天职") tom = Student() tom.study() # 当父类和子类都有相同的方法时,子类调用自己的方法 tom.speak() # 继承自父类People的方法,可以直接调用 打印理解与沟通
3.3 继承数据
class People: def __init__(self, name="", sex="", age=""): self.name = name self.sex = sex self.age = age def study(self): print("学无止境") def speak(self): print("理解与沟通") class Student(People): # 继承People类,python中可以有多个父类 def study(self): # 重写父类的方法study # super().study() # 在子类的方法中可以通过超类super()调用父类的方法 print("学习是学生的天职") # 子类没有构造函数,将执行继承自父类的构造函数 tom = Student("汤姆", "男", "18") print(tom.name) # 汤姆 print(tom.sex) # 男 print(tom.age) # 18 class Teacher(People): # 继承People类,python中可以有多个父类 def __init__(self, position="", wages=0): self.position = position self.wages = wages # 子类有构造函数时,将执行自己的构造函数 ross = Teacher("班主任", 5000) print(ross.position) # 班主任 print(ross.wages) # 5000 class Principal(People): # 继承People类,python中可以有多个父类 def __init__(self, name="", sex="", age="", working_years=0): super().__init__(name, sex, age) # 通过超类super()调用父类的构造函数__init__确保继承自父类实例变量能正确被创建 self.working_years = working_years # 子类有构造函数, bob = Principal("鲍勃", "男", "51", 30) print(bob.name) print(bob.sex) print(bob.age) print(bob.working_years)
内存图
程序自上而下运行,将class Taxi加载到代码区
实例化类Taxi对象,会运行类的构造方法__init__,传入"白色","京c007","奔驰",color保存"白色"地址值,license保存"京c007"地址值,brand保存"奔驰"地址值
程序向下运行self保存的是实例对象的地址值
将color赋值给self.color,self.color存储的是"白色"的地址值
将license赋值给self.license,self.license存储的是"京c007"的地址值
将brand赋值给self.brand,self.brand存储的是"奔驰"的地址值
最后将self赋值给bc,bc存储的是实例对象的地址值,构造函数运行结束,在内存中被释放
bc调用实例方法start,self存储的是实例对象的地址值,方法运行结束,在内存中被释放

程序自上而下运行,将class Taxi加载到代码区
实例化类Taxi对象,会运行类的构造方法__init__,传入"白色","奔驰",color保存"白色"地址值,brand保存"奔驰"地址值
程序向下运行self保存的是实例对象的地址值
将color赋值给self.color,self.color存储的是"白色"的地址值
将brand赋值给self.brand,self.brand存储的是"奔驰"的地址值
最后将self赋值给bc,bc存储的是实例对象的地址值,构造函数运行结束,在内存中被释放
将bc赋值给bm,bm存储的是实例对象的地址值
将"宝马"赋值给bm.brand,则实例对象属性brand存储的是"宝马"的地址值

程序自上而下运行,将class Taxi加载到代码区
实例化类Taxi对象,会运行类的构造方法__init__,传入"白色","奔驰",color保存"白色"地址值,brand保存"奔驰"地址值
程序向下运行self保存的是实例对象的地址值
将color赋值给self.color,self.color存储的是"白色"的地址值
将brand赋值给self.brand,self.brand存储的是"奔驰"的地址值
最后将self赋值给bc,bc存储的是实例对象的地址值,构造函数运行结束,在内存中被释放
同上bm存储的是实例对象(宝马)的地址值
运行函数func01,传入bc和bm,p1存储实例对象(奔驰)地址值,p2存储实例对象(宝马)地址值
将"银色"和"奔驰C260"分别赋值给p1.color和p2.brand,则实例属性color存储的是"银色"地址值,实例属性brand存储的是"奔驰C260"地址值
将Taxi("银色","宝马3系")赋值给p2,p2存储的是实例对象(宝马3系)的地址值,func01运行结束,在内存中被释放
bc存储的实例对象属性被改变,bm存储的实例对象属性未改变






浙公网安备 33010602011771号