一、面向对象基本概念
什么是面向对象?
面向对象编程就像 "搭乐高":
- 每个积木块都是独立的小机器人(对象),有自己的技能(方法)和工具包(属性)
- 积木之间通过标准接口互相连接,无需知道对方内部运作
- 可以用 "模具"(类)批量生产相似机器人,还能给模具加新功能(继承)
- 同一个指令能触发不同反应(多态)
核心思想:对象是类的实例,类是对象的模板
类的定义与实例化
python
运行
# 类的定义
class Car():
pass
# 类的实例化
obj = Car() # 创建对象
类的基本结构包含成员属性和成员方法:
python
运行
class Car():
# 成员属性
color = "咖啡色"
# 成员方法
def run(self):
print("fast")
类的命名规范
推荐使用驼峰命名法,如:MyCar
、StudentInfo
二、成员访问控制
Python 中成员分为两个保护等级:
- 公有成员(public):类内外均可访问
- 私有成员(private) :仅类内部可访问(命名时前面加两个下划线
__
)
对象的相关操作
python
运行
class MyCar():
# 公有成员属性
color = "咖啡色"
# 私有成员属性
__logo = "特斯拉"
# 公有成员方法
def run(self):
print("我的小车跑起来很快", self.color)
# 私有成员方法
def __info(self):
print("我的价格保密,类外不能调用")
# 实例化对象
obj = MyCar()
# 访问公有成员
print(obj.color)
obj.run()
# 动态添加属性和方法
obj.luntai = "米其林" # 添加属性
def dahuangfeng():
print("请叫我大黄蜂,我的车会变形")
obj.dahuangfeng = dahuangfeng # 添加方法
# 删除成员
del obj.luntai
类的相关操作
python
运行
# 访问类的公有成员
print(MyCar.color)
MyCar.run(MyCar())
# 动态添加类成员
MyCar.logo = "宝马" # 添加类属性
def fangxiangpan():
print("制造方向盘的方法")
MyCar.fangxiangpan = fangxiangpan # 添加类方法
# 删除类成员
del MyCar.logo
私有成员的访问方式
python
运行
class Plane():
# 私有成员属性
__airsistant = 2
# 私有方法
def __plane_info(self):
print("飞机上的空姐数量是保密的", self.__airsistant)
# 公有方法访问私有成员(推荐)
def pub_info(self):
print(self.__airsistant)
self.__plane_info()
三、面向对象三大特征
1. 封装
对类中成员属性和方法的保护,控制外界访问权限,通过公有方法访问私有成员,实现数据安全。
2. 继承
一个类获取另一个类的属性和方法,分为单继承和多继承。
python
运行
# 单继承
class Human():
hair = "黄色的"
def eat(self):
print("人类天生就会吃")
class Man(Human):
pass # 继承Human类的所有公有成员
# 多继承
class Father():
property = "抽烟喝酒"
class Mother():
property = "化妆品包包"
class Son(Father, Mother):
pass # 同时继承Father和Mother
super () 用法:
- 用于调用父类的绑定方法
- 只应用在绑定方法中,自动传递 self 对象
- 解决多继承调用关系
self 与 super 区别:
- self 先从当前类找方法,没有再找父类
- super 直接从父类开始找方法
3. 多态
不同的子类对象,调用相同的父类方法,产生不同的执行效果。
python
运行
class Soldier():
# 攻击
def attack(self):
pass
# 陆军
class Army(Soldier):
def attack(self):
print("[陆军]上来拼刺刀")
# 海军
class Navy(Soldier):
def attack(self):
print("[海军]上来就扔鱼叉子")
# 空军
class AirForce(Soldier):
def attack(self):
print("[空军]用二营长的意大利炮射击")
# 多态体现
soldiers = [Army(), Navy(), AirForce()]
for soldier in soldiers:
soldier.attack() # 相同方法,不同实现
四、魔术方法
魔术方法是在特定时机自动触发的特殊方法,以双下划线开头和结尾。
1. init 构造方法
python
运行
class Children():
def __init__(self, name, skin):
self.name = name # 初始化对象属性
self.skin = skin
obj = Children("王钢蛋", "黑色") # 实例化时自动调用
2. new 方法
python
运行
class MyClass():
def __new__(cls):
# 控制对象创建过程
return object.__new__(cls) # 创建并返回对象
单例模式(无论实例化多少次,都只有一个对象):
python
运行
class Singleton():
__obj = None
def __new__(cls):
if cls.__obj is None:
cls.__obj = object.__new__(cls)
return cls.__obj
3. del 析构方法
python
运行
class LangDog():
def __del__(self):
print("对象被回收了") # 对象被销毁时触发
obj = LangDog()
del obj # 触发析构方法