python面向对象

一、面向对象基本概念

什么是面向对象?

面向对象编程就像 "搭乐高":

  • 每个积木块都是独立的小机器人(对象),有自己的技能(方法)和工具包(属性)
  • 积木之间通过标准接口互相连接,无需知道对方内部运作
  • 可以用 "模具"(类)批量生产相似机器人,还能给模具加新功能(继承)
  • 同一个指令能触发不同反应(多态)

核心思想:对象是类的实例,类是对象的模板

类的定义与实例化

python

运行

复制代码
# 类的定义
class Car():
    pass

# 类的实例化
obj = Car()  # 创建对象

类的基本结构包含成员属性和成员方法:

python

运行

复制代码
class Car():
    # 成员属性
    color = "咖啡色"
    
    # 成员方法
    def run(self):
        print("fast")

类的命名规范

推荐使用驼峰命名法,如:MyCarStudentInfo

二、成员访问控制

Python 中成员分为两个保护等级:

  1. 公有成员(public):类内外均可访问
  2. 私有成员(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  # 触发析构方法
相关推荐
寻星探路1 天前
【Python 全栈测开之路】Python 基础语法精讲(一):常量、变量与运算符
java·开发语言·c++·python·http·ai·c#
静听松涛1331 天前
提示词注入攻击的防御机制
前端·javascript·easyui
晚风予星1 天前
简记 | 一个基于 AntD 的高效 useDrawer Hooks
前端·react.js·设计
栗子叶1 天前
网页接收服务端消息的几种方式
前端·websocket·http·通信
又是忙碌的一天1 天前
SpringMVC响应
java·服务器·数据库
菩提小狗1 天前
Sqli-Labs Less-3 靶场完整解题流程解析-豆包生成
前端·css·less
智航GIS1 天前
10.5 PyQuery:jQuery 风格的 Python HTML 解析库
python·html·jquery
小兔崽子去哪了1 天前
机器学习,梯度下降,拟合,正则化,混淆矩阵
python·机器学习
澄江静如练_1 天前
优惠券提示文案表单项(原生div写的)
前端·javascript·vue.js
C_心欲无痕1 天前
ts - 关于Object、object 和 {} 的解析与区别
开发语言·前端·javascript·typescript