坚持
  • 微信
当前位置:首页 > PYTHON >

面向对象进阶

作者:管理员 时间:2026-06-06 阅读数: 315人阅读

一、面向对象三大特性

封装:隐藏实现细节,仅对外暴露访问接口(私有属性/property实现)
继承:子类复用父类代码,增量扩展新功能
多态:同一个方法,不同对象执行不同实现(必须继承+方法重写

二、继承

1.基础语法

class 子类(父类1,父类2...): #多继承
    pass
  • 无指定父类,默认继承object(所有类顶层父类)

  • 子类不重写__init:自动调用父类构造;重写__init不会自动调用父构造,需手动

#两种调用父类构造
#1.父类名.__init(self,参数)
Person.__init__(self,name,age)
#2.super()推荐
super().__init__(name,age)

2.成员继承与重写

  1. 继承:除构造方法外所有属性、方法(含私有)均可继承

  2. 方法重写:子类定义和父类同名方法,覆盖父类实现

class Person:
    def say(self):
        print("人说话")
class Student(Person):
    def say(self): #重写
        print("学生发言")

3.MRO查找顺序

类.mro() / 类.__mro__查看继承查找顺序,多继承从左向右找方法

class C(B,A):
print(C.mro())

4.多重继承

一个子类多个父,代码冗余时慎用,同名方法靠左优先

5.super()

super代表父类定义,不是父类对象,自动遵循MRO顺序查找

super().方法名()

6.__str__重写

print(对象)str(对象)自动调用__str__,用于自定义对象描述

class Person:
    def __init__(self,name):
        self.name=name
    def __str__(self):
        return f"姓名:{self.name}"

三、多态

  1. 条件:继承 + 方法重写

  2. 核心:同一个函数接收不同子类对象,执行各自重写的方法

class Animal:
    def shout(self):pass
class Dog(Animal):
    def shout(self):print("汪汪")
class Cat(Animal):
    def shout(self):print("喵喵")
def func(ani):
    ani.shout()
func(Dog())
func(Cat())

四、运算符重载(特殊魔法方法)

运算符本质调用对应双下划线方法,重写即重载

运算符对应方法
+__add__
*__mul__
==__eq__
class Person:
    def __init__(self,name):
        self.name=name
    def __add__(self,other):
        return self.name+other.name
p1=Person("张三")
p2=Person("李四")
print(p1+p2)

常用特殊方法:
__init__构造、__del__析构、__str__字符串、__call__对象当函数调用

五、常用特殊属性

obj.__dict__    #实例属性字典
obj.__class__   #对象所属类
类.__bases__    #父类元组
类.__mro__      #继承列表
类.__subclasses__() #所有子类

六、浅拷贝&深拷贝

import copy

  1. 浅拷贝copy.copy():创建新外层对象,子对象共用引用,修改子对象原数据同步变

  2. 深拷贝copy.deepcopy():递归拷贝所有层级子对象,完全独立互不影响

七、组合(has-a,代码复用)

  • is-a → 用继承(狗是动物)

  • has-a → 用组合(手机拥有CPU,把对象当做属性)

class Cpu:pass
class Phone:
    def __init__(self,c):
        self.cpu = c #组合

八、两种常用设计模式

1.工厂模式

专门工厂类负责创建对象,创建与使用分离

class Factory:
    def create_car(self,brand):
        if brand=="宝马":return BMW()

2.单例模式

一个类只创建1个实例,重写__new__控制对象创建

class Single:
    __obj=None
    def __new__(cls,*args):
        if not cls.__obj:
            cls.__obj=object.__new__(cls)
        return cls.__obj

九、课后四道作业(原题+完整代码)

作业1:深浅拷贝

题目:定义MobilePhone、CPU、Screen,创建对象,分别引用赋值、浅拷贝、深拷贝,标注内存关系

import copy
class CPU:
    def calculate(self):
        print("CPU计算",id(self))
class Screen:
    def show(self):
        print("屏幕显示",id(self))

c = CPU()
s = Screen()
m = MobilePhone(c,s)
n = m #引用:同一个对象
m2 = copy.copy(m) #浅:手机新对象,cpu/screen共用
m3 = copy.deepcopy(m) #深:全部新对象

m.calculate()
m2.calculate()
m3.calculate()

内存说明:

  1. n=m:同一地址,无新对象

  2. copy:m/m2地址不同,cpu、screen地址完全相同

  3. deepcopy:m/m3、cpu、screen全是新内存地址

作业2:组合实现汽车类

题目:发动机Motor、底盘Chassis、座椅Seat;汽车Car组合三个类,run调用各自work()

class Motor:
    def work(self):
        print("发动机运转")
class Chassis:
    def work(self):
        print("底盘工作")
class Seat:
    def work(self):
        print("座椅就绪")

class Car:
    def __init__(self,m,c,s):
        self.motor = m
        self.chassis = c
        self.seat = s
    def run(self):
        self.motor.work()
        self.chassis.work()
        self.seat()

#调用
car = Car(Motor(),Chassis(),Seat())
car.run()

作业3:单例+工厂造电脑

题目:工厂单例,生产联想/华硕/神舟,Computer父类,各品牌重写calculate()

class Computer:
    def calculate(self):
        pass
class Lenovo(Computer):
    def calculate(self):
        print("联想电脑运算")
class Asus(Computer):
    def calculate(self):
        print("华硕电脑运算")
class Shenzhou(Computer):
    def calculate(self):
        print("神舟电脑运算")

#单例工厂
class CompFactory:
    __obj = None
    def __new__(cls):
        if not cls.__obj:
            cls.__obj = object.__new__(cls)
        return cls.__obj
    def create(self,name):
        if name=="联想":
            return Lenovo()
        elif name=="华硕":
            return Asus()
        elif name=="神舟":
            return Shenzhou()

#测试
fac = CompFactory()
pc = fac("联想")
pc.calculate()
fac2=CompFactory()
print(id(fac),id(fac2)) #地址一致,单例

作业4:Employee雇员类

需求

  1. 属性id(自增从1001,起始1000)、name、salary

  2. +重载:两个实例相加返回薪资总和

  3. @property管控salary:1000~50000

class Employee:
    __auto_id = 1000 #全局自增基数
    def __init__(self,name,salary):
        Employee.__auto_id +=1
        self.id = Employee.__auto_id
        self.name = name
        self.__salary = salary

    @property
    def salary(self):
        return self.__salary
    @salary.setter
    def salary(self,val):
        if 1000<=val<=50000:
            self.__salary = val
        else:
            print("薪资范围错误")

    #重载+
    def __add__(self,other):
        return self.salary + other.salary

#测试
e1=Employee("张三",3000)
e2=Employee("李四",5000)
print(e1+e2)
e1.salary=60000 #报错提示


上一篇:

下一篇: