在 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 的高级功能
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)