python--面向对象

57 阅读3分钟

一、核心概念:类与对象

1. 基本定义

  • 类(Class) :抽象的 “模板”,描述一类事物的共同特征(属性)和行为(方法)。
  • 对象(Object/Instance) :类的具体实例,是内存中实际存在的实体。

2. 类的定义与实例化

# 定义类:类名遵循大驼峰命名法
class Student:
    # 类文档字符串(可选)
    """学生类,描述学生的基本信息和行为"""
    
    # 实例初始化方法(构造方法)
    def __init__(self, name, age):
        # 实例属性:每个对象独有的属性
        self.name = name
        self.age = age
    
    # 实例方法:描述对象的行为,第一个参数必须是 self(指代当前实例)
    def introduce(self):
        print(f"我是{self.name},今年{self.age}岁")

# 实例化:创建类的具体对象
stu1 = Student("张三", 18)
stu2 = Student("李四", 19)

# 调用实例方法
stu1.introduce()  # 输出:我是张三,今年18岁
stu2.introduce()  # 输出:我是李四,今年19岁

# 访问实例属性
print(stu1.name)  # 输出:张三

二、属性:实例属性 vs 类属性

1. 实例属性

  • 定义:在 __init__ 中通过 self.属性名 定义,每个实例独立拥有。
  • 特点:修改一个实例的属性,不影响其他实例。

2. 类属性

  • 定义:直接在类内部、所有方法外部定义,属于类本身,所有实例共享。
  • 特点:修改类属性会影响所有实例(通过实例修改类属性会创建同名实例属性,需注意)。
class Student:
    # 类属性:所有学生共享的学校名称
    school = "北京大学"
    
    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age

# 访问类属性(类/实例均可访问)
print(Student.school)  # 输出:北京大学
stu1 = Student("张三", 18)
print(stu1.school)     # 输出:北京大学

# 修改类属性(通过类修改)
Student.school = "清华大学"
print(stu1.school)     # 输出:清华大学

# 错误示范:通过实例修改类属性(实际创建了同名实例属性)
stu1.school = "复旦大学"
print(stu1.school)     # 输出:复旦大学(实例属性)
print(Student.school)  # 输出:清华大学(类属性未变)

三、方法:实例方法 / 类方法 / 静态方法

1. 实例方法

  • 定义:第一个参数为 self,绑定实例,可访问 / 修改实例属性和类属性。
  • 调用:通过实例调用(实例.方法名()),self 由解释器自动传递。

2. 类方法

  • 定义:用 @classmethod 装饰,第一个参数为 cls(指代当前类),绑定类。
  • 作用:操作类属性,不依赖实例,可作为 “工厂方法” 创建实例。
  • 调用:类 / 实例均可调用。

3. 静态方法

  • 定义:用 @staticmethod 装饰,无默认参数(self/cls),与类 / 实例无关。
  • 作用:工具函数,逻辑上属于类但不依赖类 / 实例属性。
  • 调用:类 / 实例均可调用。
class MathUtils:
    # 类属性
    PI = 3.1415926
    
    # 实例方法(依赖实例)
    def __init__(self, radius):
        self.radius = radius
    
    def circle_area(self):
        return self.PI * self.radius **2
    
    # 类方法(依赖类)
    @classmethod
    def update_pi(cls, new_pi):
        cls.PI = new_pi
        print(f"PI已更新为:{cls.PI}")
    
    # 静态方法(无依赖)
    @staticmethod
    def add(a, b):
        return a + b

# 实例方法调用
math1 = MathUtils(5)
print(math1.circle_area())  # 输出:78.539815

# 类方法调用
MathUtils.update_pi(3.14)   # 输出:PI已更新为:3.14
print(math1.circle_area())  # 输出:78.5

# 静态方法调用
print(MathUtils.add(2, 3))  # 输出:5
print(math1.add(4, 5))      # 输出:9