欢迎光临
我们一直在努力

Python类

1. 什么是类?

类(Class)是创建对象的蓝图或模板。它定义了一组属性和方法,对象则是类的具体实例。

面向对象编程(OOP)的四大特性:

  • 封装:隐藏内部实现细节,对外暴露接口。

  • 继承:子类复用父类的代码,并可扩展或重写。

  • 多态:同一操作作用于不同对象,产生不同结果。

  • 抽象:定义抽象接口,延迟具体实现。

2. 定义类与创建对象

2.1 基本语法

使用 class 关键字定义类,类名通常使用大驼峰命名法。

class Dog:
"""一个简单的狗类"""

# 类属性(所有实例共享)
species = "Canis familiaris"

# 实例初始化方法(构造函数)
def __init__(self, name, age):
self.name = name # 实例属性
self.age = age

# 实例方法
def bark(self):
return f"{self.name} says Woof!"

def describe(self):
return f"{self.name} is {self.age} years old."

# 创建对象(实例化)
my_dog = Dog("Buddy", 3)
print(my_dog.bark()) # Buddy says Woof!
print(my_dog.species) # Canis familiaris

代码逐行解析:

  • class Dog::定义名为 Dog 的类。

  • species = "Canis familiaris":类属性,属于类本身,所有实例共享。可以通过 Dog.species 或 my_dog.species 访问。

  • def __init__(self, name, age)::构造函数(初始化方法)。当创建实例时自动调用。self 参数指向当前实例(类似 C++ 的 this 指针),必须作为第一个参数。

  • self.name = name:创建实例属性 name 并赋值。每个实例有自己的 name 和 age。

  • def bark(self)::实例方法,必须包含 self 参数。通过实例调用时,self 自动传递。

  • my_dog = Dog("Buddy", 3):实例化对象,调用 __init__,返回 Dog 实例赋值给 my_dog。

  • my_dog.bark():调用实例方法,self 自动绑定到 my_dog。

2.2 __init__ 与 self

__init__ 不是真正的构造函数(C++ 中的构造函数),而是初始化方法。对象已经创建,只是进行属性初始化。真正的对象创建由 __new__ 负责,但极少需要重写。

self 是约定俗成的名字,可以使用其他名称,但强烈不建议。


3. 属性:实例属性与类属性

  • 实例属性:属于每个实例独立,通过 self.属性 或 实例.属性 定义/访问。

  • 类属性:属于类本身,所有实例共享,通过 类名.属性 定义/访问。

class Student:
school = "清华大学" # 类属性

def __init__(self, name):
self.name = name # 实例属性

s1 = Student("张三")
s2 = Student("李四")
print(s1.school) # 清华大学(实例可读取类属性)
Student.school = "北京大学"
print(s2.school) # 北京大学(类属性改变,所有实例受影响)
s1.school = "南京大学" # 创建实例属性 school,覆盖了类属性的访问
print(s1.school) # 南京大学(实例属性)
print(s2.school) # 北京大学(类属性,未被修改)

代码解析:

  • 访问 s1.school 时,如果实例没有 school 属性,则向上查找类属性。

  • 给 s1.school 赋值,会在 s1 实例上创建新属性,不再共享类属性。

  • 类属性可通过 类名.属性 修改,影响所有未覆盖该属性的实例。

4. 方法:实例方法、类方法、静态方法

4.1 实例方法

最常见的方法,第一个参数为 self,可以访问实例属性和类属性。

class Circle:
pi = 3.14159

def __init__(self, radius):
self.radius = radius

def area(self):
return self.pi * self.radius ** 2 # 访问实例属性和类属性

4.2 类方法

使用 @classmethod 装饰器,第一个参数为 cls(类本身)。可以通过类或实例调用,常用于工厂方法。

class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day

@classmethod
def from_string(cls, date_str):
year, month, day = map(int, date_str.split('-'))
return cls(year, month, day) # 相当于 Date(…)

d = Date.from_string("2025-05-30")

代码解析:

  • cls 指向类本身,可以调用类属性或创建实例。

  • 类方法可以被子类继承和重写。

4.3 静态方法

使用 @staticmethod 装饰器,没有 self 或 cls 参数。它只是将函数组织在类的命名空间下,与类的关系较弱。

class MathUtils:
@staticmethod
def add(x, y):
return x + y

print(MathUtils.add(3, 5)) # 8

对比:

  • 实例方法:需要实例,可以修改对象状态。

  • 类方法:需要类引用,常用于替代构造函数。

  • 静态方法:无需类或实例,相当于普通函数但归属于类的命名空间。


5. 属性访问控制与封装

Python 没有严格的私有性语法(如 C++ 的 private),但通过命名约定实现“受保护”和“私有”:

  • _single_leading_underscore:约定为“受保护”,外部不应直接访问,但不会强制阻止。

  • __double_leading_underscore:名称改编(name mangling),_类名+属性名,避免子类意外覆盖,但仍然可以访问。

class Person:
def __init__(self, name, age):
self.name = name # 公有
self._internal = "内部" # 受保护(约定)
self.__secret = "秘密" # 私有(名称改编)

def get_secret(self):
return self.__secret

p = Person("Alice", 30)
print(p._internal) # 可访问(不推荐)
print(p.get_secret()) # 通过公有方法获取
# print(p.__secret) # AttributeError: 'Person' object has no attribute '__secret'
print(p._Person__secret) # 仍然可以访问,但不应该

对比 C++:

  • C++ 有 private、protected、public 关键字,编译时强制访问控制。

  • Python 依赖程序员自觉,名称改编是弱防护,主要用于避免名称冲突。


6. 继承

子类可以继承父类的属性和方法,并可以重写或扩展。

class Animal:
def __init__(self, name):
self.name = name

def speak(self):
raise NotImplementedError("Subclass must implement")

def move(self):
return f"{self.name} is moving."

class Dog(Animal):
def speak(self):
return f"{self.name} says Woof!"

class Cat(Animal):
def speak(self):
return f"{self.name} says Meow!"

animals = [Dog("Buddy"), Cat("Kitty")]
for a in animals:
print(a.speak()) # 多态
print(a.move()) # 继承自父类

代码解析:

  • class Dog(Animal): 表示 Dog 继承自 Animal。

  • 子类可以重写 speak 方法,若不重写则沿用父类的实现。

  • 多态:同一个 speak 方法调用产生不同结果。

6.1 多重继承

Python 支持多重继承,子类可以继承多个父类。方法解析顺序(MRO)采用 C3 线性化算法。

感谢你的观看,期待我们下次再见!

赞(0)
未经允许不得转载:171主机测评 » Python类
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址