Py学习  »  Python

30天入门Python(基础篇)——第11天:面向对象高级编程

码上编程学习社 • 8 月前 • 297 次点击  

资料已经打包好了,需要的关注公众号发送“111”领取

“用类管理学生信息时,总有人乱加无关属性?”

“想给属性加验证,又觉得get/set方法太麻烦?”

——学会基础面向对象后,下一步就是掌握进阶技巧,让你的类更安全、更简洁、更灵活。

今天这6个知识点(slots、@property、多重继承等),是Python开发者的“进阶标配”,学会了就能摆脱“新手代码感”。

一、用__slots__:给类“上锁”,禁止乱加属性

新手常犯的错:给Student实例加“height”“weight”等无关属性,导致数据混乱。__slots__能指定类的“允许属性列表”,禁止添加列表外的属性,像给类画了条“红线”。

class Student:    # 只允许有name、age、score三个属性    __slots__ = ("name""age""__score")  # 私有属性也要写进去    def __init__(self, name, age, score):        self.name = name        self.age = age        self.__score = scores = Student("小明"1685)s.age = 17  # 允许修改已定义属性# 尝试添加无关属性,直接报错# s.height = 175  # 报错:'Student' object has no attribute 'height'


避坑点:__slots__只对当前类生效,子类需重新定义才会继承;属性列表里要包含私有属性(如__score),否则无法使用。

二、用@property:把方法“伪装”成属性,简洁又安全

之前用get_score()、set_score()控制成绩访问,代码有点啰嗦。@property装饰器能把方法变成“只读属性”,搭配@属性名.setter还能实现可控修改,兼顾简洁与安全。

class Student:    def __init__(self, name, score):        self.name = name        self.__score = score  # 私有属性    # 把方法变成属性,直接用s.score访问    @property    def score(self):        return self.__score    # 允许修改score属性,自动触发验证    @score.setter    def score(self, new_score):        if 0 <= new_score <= 100:            self.__score = new_score        else:            raise ValueError("成绩必须在0-100之间")s = Student("小红"92)print(s.score)  # 像属性一样访问,输出92s.score = 95    # 像属性一样修改,自动验证# s.score = 105  # 触发异常:ValueError


用@property后,代码更像“操作属性”,但背后藏着验证逻辑,这就是Python的“优雅”之处。

三、多重继承:一个类拥有多个“技能包”

之前学的是单继承(如高中生继承学生),但实际场景中,一个类可能需要多个类的功能。比如“学生会干部”既要会学生的学习,也要会干部的组织活动,这就需要多重继承。

# 父类1:学生的基础功能class Student:    def study(self):        print("专注学习")


    
# 父类2:干部的管理功能class Cadre:    def organize(self):        print("组织班级活动")# 子类:学生会干部,继承两个父类class StudentCadre(StudentCadre):    def work(self):        print("边学习边工作")sc = StudentCadre()sc.study()     # 继承Student的方法,输出“专注学习”sc.organize()  # 继承Cadre的方法,输出“组织班级活动”sc.work()      # 自己的方法,输出“边学习边工作”


核心原则:继承顺序从左到右,若两个父类有同名方法,优先用左边父类的。多重继承别滥用,否则代码会变复杂。

四、定制类:让你的类“自带特效”

Python里的print()、len()等函数,能对列表、字符串生效,其实是因为它们的类定制了特殊方法(如__len__、__str__)。我们的类也能定制这些方法,实现“自带特效”。

class Student:    def __init__(self, name, age):        self.name = name        self.age = age    # 定制print()输出内容    def __str__(self):        return f"学生:{self.name},年龄:{self.age}"    # 定制len()功能,返回年龄(仅作示例)    def __len__(self):        return self.ages = Student("小李"17)print(s)  # 不再输出对象地址,而是__str__的内容:学生:小李,年龄:17print(len(s))  # 调用__len__,输出17


常用的定制方法还有__iter__(让类可迭代)、__getitem__(让类支持下标访问),按需使用能让类更灵活。

五、枚举类:让常量“有名字”,避免魔法数字

管理学生性别时,用0代表男、1代表女,时间长了容易忘(这叫“魔法数字”)。枚举类能给这些数字起名字,代码可读性瞬间提升。

from enum import Enum# 定义枚举类,继承Enumclass Gender(Enum):    MALE = 0    # 男,值为0    FEMALE = 1  # 女,值为1class Student:    def __init__(self, name, gender):        self.name = name        self.gender = gender# 使用枚举类,清晰易懂s1 = Student("小明", Gender.MALE)s2 = Student("小红", Gender.FEMALE)print(s1.gender)  # 输出Gender.MALEprint(s1.gender.value)  # 取枚举值,输出0


优势:枚举值不能修改,避免误改;使用时不用记数字,直接用名字,团队协作更高效。

六、元类:类的“缔造者”,进阶中的进阶

元类是“创建类的类”,普通类是元类的实例。这个概念比较抽象,新手不用深究实现,但要知道它的核心用途:批量修改类的属性或方法。比如给所有Student子类加“school”属性。

# 定义元类(继承type)class SchoolMeta(type):    # 创建类时自动执行    def __new__(cls, name, bases, attrs):        # 给类加一个school属性        attrs["school"] = "阳光中学"        return super().__new__(cls, name, bases, attrs)# 用元类创建类,所有该类的实例都有school属性class Student(metaclass=SchoolMeta):    def __init__(self, name):


    
        self.name = names = Student("小张")print(s.school)  # 输出:阳光中学,不用手动定义


元类多用于框架开发,新手先了解“有这个东西”即可,后续做复杂项目时再深入。

今天的6个知识点,核心是“优化类的设计”:

__slots__保证数据安全,@property简化接口,多重继承实现功能组合,定制类提升灵活性,枚举类增强可读性,元类实现批量控制。

新手不用一次性全掌握,先把@property和枚举类用熟,这两个在日常开发中最常用。

【今日任务】

定义一个“Teacher”类:

① 用__slots__限制属性为name、subject、salary;

② 用@property控制salary(范围3000-20000);

③ 定制__str__方法,输出“教师:XXX,教XXX”;

④ 创建实例测试。

最后

以上就是今天给你分享的内容,觉得有用的话欢迎点赞收藏哦!

如果你也对Python这门编程感兴趣的话,欢迎加入我们。(小白也可以参加)

  Python零基础实战特训营 
三更老师亲自上课示范,2天:理论+实操教学+直播教学演示+课后辅导

获取方式:

1.关注下方公众号↓↓↓↓

2.点赞+再看

3.在后台发送:“python” 即可 领取资料福利/开通上课权限

资料已经打包好了,需要的关注公众号发送“111”领取

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/190473