Python中class定义系统讲解
目录
一、Python 中 class 的基本概念
二、基本语法
三、关键组件说明
四、类变量 vs 实例变量
五、方法类型
六、继承与多态
七、特殊方法(Magic Methods)
八、数据封装:私有变量和属性访问
九、类方法工厂(Class Method Factory)
十、只读属性(Read-Only Property)
总结
一、Python 中 class 的基本概念
类(class)是创建对象的模板(蓝图)。它描述了对象的属性(变量)和行为(函数)。
在 Python 中,class 是一种可以生成对象的“可调用对象”,本质上是一种“工厂函数”。
可以通过 type(obj) 查看对象的类型。
常见用途场景包括:
场景 | 示例 |
---|---|
面向对象开发 | 如电商系统中的“用户、商品、订单”类 |
封装逻辑与状态 | 比如一个“任务管理器” |
模拟数据库模型 | 使用 ORM,如 SQLAlchemy 或 Django |
创建插件、组件系统 | 自定义组件类、策略类等 |
二、基本语法
class 类名(父类名):def __init__(self, 参数):self.属性 = 参数def 方法名(self):pass
示例:
class Person:def __init__(self, name, age): # 构造函数self.name = nameself.age = agedef greet(self):print(f"你好,我是 {self.name},今年 {self.age} 岁。")# 创建对象
p = Person("小明", 18)
p.greet()
三、关键组件说明
组件名 | 作用 |
---|---|
class | 定义一个类 |
__init__ | 构造函数,创建对象时自动调用 |
self | 实例本身的引用,相当于 Java 中的 this |
方法(函数) | 定义类的行为(操作属性、实现功能) |
属性(变量) | 绑定在 self 上,表示对象的状态 |
四、类变量 vs 实例变量
class Dog:species = "犬类" # 类变量,所有实例共享def __init__(self, name):self.name = name # 实例变量dog1 = Dog("旺财")
dog2 = Dog("小黑")print(dog1.species) # 犬类
print(dog2.name) # 小黑
五、方法类型
方法类型 | 定义方式 | 特点 |
---|---|---|
实例方法 | def method(self) | 最常用,操作实例对象 |
类方法 | @classmethod + def method(cls) | 操作类本身(cls 是类的引用) |
静态方法 | @staticmethod + def method() | 与类无关,像普通函数放在类中 |
示例:
class MathTool:@staticmethoddef add(a, b):return a + b
六、继承与多态
class Animal:def speak(self):print("动物发出声音")class Dog(Animal):def speak(self):print("狗叫:汪汪!")a = Dog()
a.speak() # 多态:根据对象实际类型调用
七、特殊方法(Magic Methods)
这些是 Python 的“魔术方法”,可重载以改变类行为。
方法名 | 作用 |
---|---|
__init__ | 构造函数 |
__str__ | 打印字符串 |
__repr__ | 调试输出 |
__len__ | len(obj) 时调用 |
__getitem__ | 支持下标访问 obj[key] |
__eq__、__lt__ | 实现比较操作符 |
八、数据封装:私有变量和属性访问
Python 没有严格的私有变量,但使用约定:
- _变量名:受保护的(不推荐外部访问)
- __变量名:类内私有(有名称改写,防止冲突)
class User:def __init__(self, name):self.__name = name # 私有变量def get_name(self):return self.__name
九、类方法工厂(Class Method Factory)
类方法工厂是指通过 @classmethod 创建实例的“备用构造器”,用于处理不同初始化需求。
示例:
使用类方法创建不同来源的对象
class User:def __init__(self, username, email):self.username = usernameself.email = email@classmethoddef from_string(cls, data_str):"""从字符串创建 User 实例"""name, email = data_str.split(",")return cls(name.strip(), email.strip())# 用法
user1 = User("alice", "alice@example.com")
user2 = User.from_string("bob, bob@example.com")print(user1.username) # alice
print(user2.username) # bob
类方法工厂的常见用途:
用途 | 示例 |
---|---|
从字符串/JSON 初始化 | User.from_json(json_str) |
从数据库记录生成 | Model.from_row(row) |
批量构造对象 | User.create_batch(list_of_dicts) |
处理默认参数逻辑 | Logger.with_default_settings() |
十、只读属性(Read-Only Property)
使用 @property 修饰方法可以将其变为“属性形式访问的只读方法”。
示例:
定义一个只能读取的属性
class Circle:def __init__(self, radius):self._radius = radius@propertydef radius(self):return self._radius@propertydef area(self):return 3.1416 * self._radius ** 2# 用法
c = Circle(5)
print(c.radius) # 5
print(c.area) # 78.54# c.radius = 10 # ❌ 报错:AttributeError,只读
如果想支持只读+有条件写入?
可以使用 @radius.setter:
class Circle:def __init__(self, radius):self._radius = radius@propertydef radius(self):return self._radius@radius.setterdef radius(self, value):if value <= 0:raise ValueError("半径必须为正数")self._radius = value
总结
功能 | 用法关键字 | 用途说明 |
---|---|---|
类方法工厂 | @classmethod | 用类方法替代构造器,返回类实例 |
只读属性 | @property | 把方法当属性用,用户无法修改 |
控制赋值逻辑 | @property + @setter | 限制属性的修改规则 |