Python 类和对象详解(Python 3.x)
Python 是一种面向对象的编程语言,类(Class)和对象(Object)是其核心概念。类是对象的模板,定义了对象的属性和方法;对象是类的实例,具有类所定义的特征和行为。本文将详细介绍 Python 中类和对象的创建、方法、变量、继承等核心特性。
类的定义与对象的创建
基本语法
使用 class 关键字定义类,类名通常采用帕斯卡命名法(首字母大写,如 Person)。通过类名加括号(无需 new 关键字)创建对象。
1 | # 定义空类(pass 表示空代码块) |
类中的方法
类中的函数称为方法,与普通函数的区别是:方法的第一个参数必须是 self(表示对象自身,类似 Java 的 this)。调用方法时,self 由 Python 自动传递,无需手动传入。
1 | class Person: |
构造方法 __init__
__init__ 是 Python 的构造方法,用于对象初始化(创建对象时自动调用),相当于 Java 中与类名同名的构造函数。
基本使用
1 | class Person: |
说明:
__init__方法在对象创建时自动执行,用于初始化属性。self.name和self.age是对象的实例属性,每个对象都有独立的副本。
默认参数构造方法
__init__ 支持默认参数,使创建对象时部分参数可选:
1 | class Student: |
类变量与实例变量
Python 中有两种变量:类变量(属于类,所有对象共享)和实例变量(属于对象,每个对象独立)。
实例变量
通过 self.变量名 定义,每个对象有独立的值,如 self.name、self.age。
类变量
在类中直接定义(不在方法内),属于类本身,所有对象共享该变量。通过 类名.变量名 或 self.类名.变量名 访问。
1 | class Employee: |
区别:
- 实例变量:每个对象独立,如
e1.name和e2.name可以不同。 - 类变量:所有对象共享,修改类变量会影响所有对象。
继承
继承是面向对象的核心特性,允许子类(派生类)继承父类(基类)的属性和方法,实现代码复用。Python 支持单继承和多继承。
单继承
语法:class 子类名(父类名):
1 | # 父类 |
重写父类方法
子类可以重写父类的方法(包括 __init__),覆盖父类的实现:
1 | class Cat(Animal): |
调用父类方法
若子类重写了父类方法,可通过 super() 或 父类名 调用父类的方法:
1 | class Bird(Animal): |
super() 的作用:
- 在子类中调用父类的方法,避免硬编码父类名,增强代码可维护性。
多继承
Python 支持多继承(一个子类继承多个父类),语法:class 子类名(父类1, 父类2, ...):
1 | # 父类1 |
注意:多继承可能导致菱形问题(多个父类继承自同一基类),需谨慎使用。Python 通过 MRO(方法解析顺序)机制解决冲突(多个父类具有相同方法的话,哪个父类在前边就用哪个的)。
内置属性
__mro__可以查看方法搜索顺序
对象的属性访问控制
Python 没有严格的访问修饰符(如 Java 的 private、public),但可通过命名约定实现类似效果:
- 公开属性:直接定义(如
self.name),可被外部访问。 - 私有属性:命名以双下划线
__开头(如self.__age),外部无法直接访问(实际是名称改写机制)。
1 | class Person: |
说明:
- 私有属性并非绝对不可访问,Python 会将
__age改写为_Person__age,外部可通过p._Person__age访问(不推荐)。 - 命名约定的核心是 “约定优于配置”,提醒开发者不要随意修改私有属性。
常用的特殊方法
Python 类中以双下划线开头和结尾的方法(如 __init__)称为特殊方法(或魔术方法),用于实现对象的特殊行为。
| 特殊方法 | 作用 | 示例 |
|---|---|---|
__init__ |
构造方法,初始化对象 | def __init__(self, name): ... |
__str__ |
定义对象的字符串表示(str()) |
def __str__(self): return self.name |
__repr__ |
定义对象的官方字符串表示 | def __repr__(self): return f"Person({self.name})" |
__len__ |
定义 len(obj) 的行为 |
def __len__(self): return len(self.data) |
示例:__str__ 方法
1 | class Book: |