哈喽,各位Python学习者!👋
不管你是刚入门的新手,还是正在进阶的程序员,肯定绕不开「类」这个核心知识点——它就像Python里的“万能模具”,能帮你把重复代码“打包”,让代码更简洁、更易维护,甚至实现复杂的项目功能。
很多人觉得类很难,其实只要掌握它的常见用法,就能快速上手,再也不用被重复代码折磨!今天就把Python类的所有高频用法,一次性讲透,搭配极简代码示例,新手也能跟着敲、跟着用,文末还有专属福利哦~
一、先搞懂:类是什么?(新手必看)
简单来说,类(class)是用来定义对象的“模板”,而对象是类的“实例”。就像做蛋糕:类是蛋糕模具(规定了蛋糕的形状、大小),对象就是用这个模具做出来的每一个蛋糕(各自可以有不同的口味、装饰)。
在Python中,类里包含两种核心东西:
属性:相当于对象的“特征”(比如蛋糕的口味、大小,人的身高、年龄);
方法:相当于对象的“行为”(比如蛋糕可以被吃,人可以说话、走路)。
举个最基础的例子,一看就懂:
# 定义一个「女孩」类(模板)class Girl:# 类属性(所有对象共用的特征) look = '可爱' height = '165cm'# 类方法(所有对象共用的行为)def code(self):print("我会写Python代码~")def say(self):print("一起学好Python呀!")# 实例化对象(用模板做蛋糕)g = Girl()# 调用对象的属性print(g.look) # 输出:可爱# 调用对象的方法(注意加括号)g.code() # 输出:我会写Python代码~
重点提醒:类名首字母必须大写(比如Girl、Student),这是Python的规范,一眼就能区分类和普通变量/函数。
二、Python类的10个常见用法(实战必备)
下面这些用法,覆盖了日常开发80%的场景,从基础到进阶,每一个都配了可直接复制的代码,建议收藏后慢慢练!
用法1:基本定义与实例化(最基础)
这是最入门的操作,核心是用class关键字定义类,再通过「类名()」创建对象(实例化)。
# 定义类class Student:# 类属性 school = "Python编程学院"# 实例方法(必须带self参数)def introduce(self):print(f"我是{self.name},来自{self.school}")# 实例化对象stu1 = Student()# 给对象添加实例属性(单独属于这个对象)stu1.name = "小明"# 调用方法stu1.introduce() # 输出:我是小明,来自Python编程学院
用法2:__init__构造方法(初始化对象)
上面的写法,需要单独给对象添加属性,有点麻烦。而「__init__」方法(双下划线开头结尾),能在实例化对象时,直接初始化属性,相当于“造蛋糕时直接加配料”。
self是核心:相当于“当前对象本身”,用来绑定属性和方法,必须放在方法的第一个参数位置。
# 用__init__初始化对象class Student:# 构造方法,实例化时自动执行def __init__(self, name, age):# 实例属性(每个对象单独拥有)self.name = nameself.age = age# 类属性(所有对象共用)self.school = "Python编程学院"def introduce(self):print(f"我叫{self.name},今年{self.age}岁,来自{self.school}")# 实例化时直接传入参数,无需单独添加属性stu1 = Student("小明", 18)stu2 = Student("小红", 17)stu1.introduce() # 输出:我叫小明,今年18岁,来自Python编程学院stu2.introduce() # 输出:我叫小红,今年17岁,来自Python编程学院
用法3:类属性与实例属性(区分清楚不踩坑)
很多新手会混淆类属性和实例属性,其实两者很好区分:
类属性:定义在类里面、__init__外面,所有对象共用,修改一个会影响所有对象;
实例属性:定义在__init__里面(用self.xxx),每个对象单独拥有,修改一个不影响其他对象。
class Student:# 类属性(共用) school = "Python编程学院"def __init__(self, name):# 实例属性(单独拥有)self.name = name# 实例化两个对象stu1 = Student("小明")stu2 = Student("小红")# 修改实例属性(只影响当前对象)stu1.name = "小刚"print(stu1.name) # 输出:小刚print(stu2.name) # 输出:小红# 修改类属性(影响所有对象)Student.school = "Python进阶学院"print(stu1.school) # 输出:Python进阶学院print(stu2.school) # 输出:Python进阶学院
用法4:实例方法、类方法、静态方法(3种方法区别)
类里面的方法分3种,用途不同,别用混了,一张表+代码讲清楚:
class Student: school = "Python编程学院"# 1. 实例方法(最常用)def introduce(self):print(f"我是{self.name},来自{self.school}")# 2. 类方法(用@classmethod装饰) @classmethoddef change_school(cls, new_school): cls.school = new_school # 操作类属性# 3. 静态方法(用@staticmethod装饰) @staticmethoddef add(a, b):return a + b # 独立功能,和类/对象无关# 实例方法调用(需实例化对象)stu = Student()stu.name = "小明"stu.introduce()# 类方法调用(无需实例化,直接用类名调用)Student.change_school("Python高手学院")print(stu.school) # 输出:Python高手学院# 静态方法调用(类名/对象都能调用)print(Student.add(10, 20)) # 输出:30print(stu.add(5, 5)) # 输出:10
用法5:封装(隐藏细节,更安全)
封装就像“打包”,把类的属性和方法藏起来,只对外提供有限的访问接口,避免误操作。在Python中,用「双下划线__」开头定义私有属性/方法,外部无法直接访问。
比如:游戏账号是一个类,里面的点券、符文是私有属性,不能随便被修改,只能通过指定方法操作。
class GameAccount:def __init__(self, username, password, money):self.username = usernameself.__password = password # 私有属性(外部无法直接访问)self.__money = money # 私有属性# 提供访问私有属性的接口(get方法)def get_money(self):return self.__money# 提供修改私有属性的接口(set方法)def add_money(self, num):if num > 0:self.__money += numprint(f"充值成功,当前余额:{self.__money}")else:print("充值金额无效!")# 实例化对象account = GameAccount("python123", "123456", 100)# 正确访问/修改私有属性(通过接口)print(account.get_money()) # 输出:100account.add_money(50) # 输出:充值成功,当前余额:150# 错误操作(外部无法直接访问私有属性)# print(account.__password) # 报错# account.__money = 1000 # 报错
用法6:继承(代码复用,事半功倍)
继承就像“传家宝”,子类可以直接继承父类的所有属性和方法,还能在父类的基础上修改、新增内容,不用重复写代码——这是Python中实现代码复用的核心技巧。
语法:class 子类名(父类名):
# 父类(基础类)class Person:def __init__(self, name, age):self.name = nameself.age = agedef eat(self):print(f"{self.name}在吃饭~")# 子类(继承父类)class Student(Person):# 新增子类独有的属性def __init__(self, name, age, student_id):# 继承父类的__init__方法(两种方式)# 方式1:super()调用父类方法(推荐)super().__init__(name, age)# 方式2:直接调用父类名# Person.__init__(self, name, age)self.student_id = student_id# 新增子类独有的方法def study(self):print(f"{self.name}(学号:{self.student_id})在学习Python~")# 实例化子类对象stu = Student("小明", 18, "2024001")# 调用父类的方法stu.eat() # 输出:小明在吃饭~# 调用子类的方法stu.study() # 输出:小明(学号:2024001)在学习Python~
用法7:多态(同一方法,不同表现)
多态的核心是:不同对象,调用同一个方法,产生不同的结果。就像同样是“打招呼”,男生和女生的说法不一样,不用修改方法名,就能实现不同的功能。
# 父类class Person:def greet(self):pass# 空方法,供子类重写# 子类1class Boy(Person):def greet(self):print("嗨,兄弟!一起打游戏不?")# 子类2class Girl(Person):def greet(self):print("哈喽~ 今天也要开心呀!")# 统一调用方法(多态体现)def say_hello(person): person.greet()# 实例化不同对象boy = Boy()girl = Girl()# 调用同一个函数,输出不同结果say_hello(boy) # 输出:嗨,兄弟!一起打游戏不?say_hello(girl) # 输出:哈喽~ 今天也要开心呀!
用法8:重写(修改父类方法,适配子类)
子类继承父类后,如果父类的方法不符合子类的需求,就可以“重写”父类方法——在子类中定义和父类同名的方法,覆盖父类的实现。
class Person:def introduce(self):print("我是一个普通人~")class Student(Person):# 重写父类的introduce方法def introduce(self):print("我是一名学生,专注学习Python!")# 实例化对象p = Person()s = Student()p.introduce() # 输出:我是一个普通人~s.introduce() # 输出:我是一名学生,专注学习Python!(子类重写后的结果)
用法9:魔术方法(特殊方法,简化操作)
魔术方法就是以「__」开头和结尾的方法(比如__init__),Python自带,不用手动调用,在特定场景下会自动触发,能极大简化代码。
常用魔术方法(必记):
__str__:打印对象时,返回自定义字符串(替代默认的内存地址);
__del__:删除对象时,自动执行(清理资源)。
class Student:def __init__(self, name, score):self.name = nameself.score = score# 重写__str__方法,打印对象更友好def __str__(self):return f"学生:{self.name},分数:{self.score}"# 重写__add__方法,实现两个学生分数相加def __add__(self, other):return self.score + other.score# 实例化对象stu1 = Student("小明", 90)stu2 = Student("小红", 85)# 触发__str__方法print(stu1) # 输出:学生:小明,分数:90# 触发__add__方法print(stu1 + stu2) # 输出:175
用法10:类的动态修改(Python灵活特性)
Python的类是动态的,即使类已经定义完成,也能随时添加、修改、删除类的属性和方法——这是Python和其他编程语言(比如Java)的重要区别,灵活性拉满。
# 定义一个空类class Student:pass# 动态添加类属性Student.school = "Python编程学院"# 动态添加实例属性stu = Student()stu.name = "小明"# 动态添加实例方法def introduce(self):print(f"我是{self.name},来自{self.school}")# 给对象绑定方法stu.introduce = introduce.__get__(stu)stu.introduce() # 输出:我是小明,来自Python编程学院# 动态添加类方法@classmethoddef change_school(cls, new_school): cls.school = new_schoolStudent.change_school = change_schoolStudent.change_school("Python进阶学院")print(stu.school) # 输出:Python进阶学院
三、新手避坑指南(必看!)
很多人学类的时候,容易踩这几个坑,提前避开,少走弯路:
self不能少:实例方法的第一个参数必须是self,否则会报错(self只是约定俗成的名字,换成其他名字也可以,但不推荐);
私有属性不是“绝对私有”:Python中没有真正的私有属性,用「_类名__私有属性名」也能访问,但不建议这么做,遵守封装规范;
继承时注意初始化:子类重写__init__方法时,一定要先调用父类的__init__方法,否则会丢失父类的属性;
类方法和静态方法的区别:类方法操作类属性(用cls),静态方法和类/对象无关,不要乱用。