在 Python 中,Class(类别) 是一种用来\'封装数据\'和\'操作数据方法\'的结构。Class 提供了创建自定义数据类型的能力,可以用来模拟实际世界的物件或场景。

Class 的主要概念

  • 类别(Class):定义物件的结构(蓝图/范本),包括它的属性和行为。
  • 物件(Object):物件是类别的「实例化后的产物」,拥有类中定义的属性与方法。类别的具体实例,拥有类别定义的属性和方法。复制Class来建立另一个class的副本
  • 属性(Attribute):类别或物件的数据成员,类似于变数。
  • 方法(Method):操作物件数据的函数,类似于功能。

「实例化后的产物」指的是当我们使用类(Class)创建出物件(Object)时生成的具体实例。实例化是一个过程,把类这个模板具体化,生成能实际使用的物件。每个物件都是类的实例(Instance)。

简单解释:类与物件的关系类(Class)是一个概念、一个模板,就像建筑图纸。实例化(Instantiation)就是用这个模板制造出一个具体的东西。物件(Object)是实例化后的产物,就像按图纸建造出来的建筑。

定义和使用 Class

基本语法

class ClassName:
def __init__(self, attribute1, attribute2):
self.attribute1 = attribute1 # 定义属性
self.attribute2 = attribute2

def method(self):
return f"Attribute1 is {self.attribute1}, Attribute2 is {self.attribute2}"

使用类来建立物件 Class 时会呼叫建构式Constructor并赋于属性值__init__就是类的「建构子」(constructor),但不像某些语言的建构子会直接建立物件,而是用来初始化物件。

建构式 (Constructor)

Python 中的建构式 (Constructor)是类的 init 方法,用于初始化物件的属性。** 建构式的功能 **

  • 初始化物件属性:设定物件需要的初始值。
  • 提高代码可读性与可用性:自动完成初始化,避免手动重复设定。
  • 物件的基本配置:确保物件在创建后能立即使用。

建构式在 Python 中的特性

  • 特殊方法 init:Python 使用这个方法作为建构式,类似于其他语言中的 constructor。
  • 自动调用:在物件实例化时自动执行。
  • 第一个参数永远是 self:代表被创建的物件本身。

** 建构式的注意事项 **

  • 不能手动调用 init:建构式由 Python 自动执行,手动调用会造成混乱。
  • 每个类别只能有一个 init。

关键特性和使用示例

  • 定义类别
  • class Person:
    # 初始化方法 (__init__)
    def __init__(self, name, age):
    self.name = name # 设定物件的属性 name
    self.age = age # 设定物件的属性 age

    # 定义方法
    def greet(self):
    return f"Hello, my name is {self.name} and I am {self.age} years old."

  • 创建物件(实例化类别)
  • person1 = Person("Alice", 25) # 创建 Person 类的实例
    person2 = Person("Bob", 30)

    # 使用物件属性
    print(person1.name) # 输出: Alice

    # 呼叫物件方法
    print(person2.greet()) # 输出: Hello, my name is Bob and I am 30 years old.

    类属性(Class Attribute)

    在 Python 中,如果某个属性是所有物件(实例)都需要‘共享’的,那么可以使用**类属性(Class Attribute)**来处理。类属性是属于类本身的,所有该类的实例共享同一个值,而不是每个实例拥有自己的拷贝。

    如何设置类属性类属性是在类中定义的变数,通常在类的定义中直接设置,而不是在 init 方法中。实例可以访问类属性,但类属性并不属于个别的实例。

    class Dog:
    # 类属性
    species = "Canis Familiaris" # 所有狗的共同属性

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

    # 创建物件
    dog1 = Dog("Buddy", "Golden Retriever")
    dog2 = Dog("Max", "German Shepherd")

    # 访问类属性
    print(dog1.species) # 输出: Canis Familiaris
    print(dog2.species) # 输出: Canis Familiaris

    # 修改类属性
    Dog.species = "Canis Lupus Familiaris"

    # 所有实例都会看到改动
    print(dog1.species) # 输出: Canis Lupus Familiaris
    print(dog2.species) # 输出: Canis Lupus Familiaris

    Class 的高级功能

  • 继承(Inheritance)子类别继承父类别的属性和方法,并可进行扩展。
  • class Animal:
    def __init__(self, species):
    self.species = species

    def sound(self):
    return "Some generic sound"

    class Dog(Animal):
    def __init__(self, name, species="Dog"):
    super().__init__(species) # 继承父类别的初始化
    self.name = name

    def sound(self):
    return "Woof!" # 覆盖父类别的方法

    dog = Dog("Buddy")
    print(dog.sound()) # 输出: Woof!

    super() 的作用

    super() 是一个内建函数,用于调用**父类(或基本base类)**的方法关键点:

    • 避免硬编码父类名:如果父类名称改变,super() 能自动适应,而不需要手动修改代码。
    • 支持多重继承:super() 能正确处理多重继承的情况,遵循方法解析顺序(MRO, Method Resolution Order)。
  • 私有属性与方法使用双下划线前缀(__)表示属性或方法是私有的。
  • class Example:
    def __init__(self):
    self.__private_attr = "Private"

    def __private_method(self):
    return "This is private"

    def public_method(self):
    return f"Accessing: {self.__private_attr}"

    example = Example()
    print(example.public_method()) # 可透过公有方法访问私有属性

    Private 的用途

    • 保护数据:防止外部代码意外或恶意修改类内的核心数据。
    • 封装细节:将内部逻辑封装起来,只暴露必须的接口(公共方法)。
    • 提高灵活性:可以随时更改私有属性和方法的内部实现,而不会影响外部代码。何时使用私有属性或方法?当你希望某些属性或方法只在类内部使用时。需要隐藏实现细节,提供简单、清晰的公共接口。需要防止外部代码直接依赖类的内部实现。

    Class 的应用场景

    • 模拟现实世界的物件:如车、动物、学生。
    • 封装代码逻辑:便于复用和维护。
    • 数据模型设计:如 Django ORM 的数据表模型。
    • 设计模式的实现:如单例模式、工厂模式等。

    多重继承 (Multiple Inheritance)

    多重继承 是指一个类别可以同时继承多个父类别的特性和行为。在 Python 中,多重继承是一种允许类别设计更灵活的方法,但也需要谨慎使用以避免复杂性问题。

    class Animal:
    def eat(self):
    print("This animal can eat.")

    class Flyable:
    def fly(self):
    print("This animal can fly.")

    class Bird(Animal, Flyable): # 同时继承 Animal 和 Flyable
    def chirp(self):
    print("Bird is chirping.")

    # 使用 Bird 类别
    bird = Bird()
    bird.eat() # 来自 Animal 类别
    bird.fly() # 来自 Flyable 类别
    bird.chirp() # 来自 Bird 类别

    输出:This animal can eat.This animal can fly.Bird is chirping.

    优点行为组合:可以将不同父类别的功能组合在一起,形成更强大的子类别。代码重用:避免重复撰写通用功能。更灵活的设计:允许将不同责任分散到多个类别中,并在子类别中合併。

    方法解析顺序 (MRO, Method Resolution Order)