Python编程基础:类与对象的面向对象基础

90 阅读6分钟

面向对象编程(OOP):类与对象基础

面向对象编程是一种编程范式,它使用“对象”来设计应用程序。对象可以包含数据(即属性)和代码(即方法)。在Python中,class关键字是用来定义一个对象的蓝图。

这里先简单了解面向对象编程这个概念, 文末会给出详细解释。

1. 类(Class)

类是对象的模板,它描述了对象的行为和状态。

class Dog:
    # 类变量
    species = 'Canis familiaris'

    # 初始化方法
    def __init__(self, name, age):
        # 实例变量
        self.name = name
        self.age = age

    # 实例方法
    def description(self):
        return f"{self.name} is {self.age} years old"

    # 另一个实例方法
    def speak(self, sound):
        return f"{self.name} says {sound}"

在上面的代码中,Dog类有两个实例变量nameage,以及一个类变量species。实例方法description返回关于狗的描述,而'speak方法则是狗的发声行为。

2. 对象(Object)

对象是类的实例。

# 创建Dog类的实例
my_dog = Dog("Rex", 5)

# 访问实例变量
print(my_dog.name)  # 输出: Rex
print(my_dog.age)   # 输出: 5

# 调用实例方法
print(my_dog.description())  # 输出: Rex is 5 years old
print(my_dog.speak("Woof Woof"))  # 输出: Rex says Woof Woof

# 访问类变量
print(my_dog.species)  # 输出: Canis familiaris

每次当我们创建一个新的Dog对象时,__init__方法都会被调用,它会设置nameage这两个实例变量。

3. 继承(Inheritance)

继承是面向对象编程的一个关键概念。它允许一个类继承另一个类的方法和属性。

# 基类/父类
class Dog:
    # ...

# 子类/派生类
class Bulldog(Dog):
    def run(self, speed):
        return f"{self.name} runs {speed}"

# 创建Bulldog类的实例
my_dog = Bulldog("Tom"6)
print(my_dog.description())  # 继承自Dog类
print(my_dog.run("slowly"))  # 输出: Tom runs slowly

在这个例子中,Bulldog类继承了Dog类的所有方法和属性,并添加了一个新的方法run

4. 多态(Polymorphism)

多态允许我们定义方法,这些方法可以在不同类型的对象上具有不同的行为。

class Dog:
    # ...
    def speak(self):
        return "Woof Woof"

class Cat:
    # ...
    def speak(self):
        return "Meow"

# 创建不同的对象
my_dog = Dog("Rex"5)
my_cat = Cat("Whiskers"3)

# 同一个方法,不同的行为
print(my_dog.speak())  # 输出: Woof Woof
print(my_cat.speak())  # 输出: Meow

尽管my_dogmy_cat是不同类型的对象,但它们都有一个'speak方法。在运行时,Python会自动调用相应对象的'speak方法。

综合示例

让我们通过一个简单的综合示例,将文章中提到的面向对象编程(OOP)概念混合在一起。此示例将创建一个Animal类作为基类,然后定义两个子类DogCat,它们都会继承Animal类,并且拥有自己的特殊行为。

class Animal:
    # 类变量,适用于所有动物实例
    kingdom = 'Animalia'
    
    def __init__(self, name, age):
        # 实例变量
        self.name = name
        self.age = age

    # 实例方法
    def introduce(self):
        return f"My name is {self.name} and I am {self.age} years old."

    # 要求子类实现的方法
    def speak(self):
        raise NotImplementedError("Subclass must implement abstract method")


class Dog(Animal):
    # Dog类的构造函数
    def __init__(self, name, age, breed):
        super().__init__(name, age)  # 调用父类的构造函数
        self.breed = breed

    # 重写speak方法
    def speak(self):
        return "Woof Woof"

    # Dog类特有的方法
    def fetch(self, item):
        return f"{self.name} fetched {item}!"


class Cat(Animal):
    # Cat类的构造函数
    def __init__(self, name, age, color):
        super().__init__(name, age)  # 调用父类的构造函数
        self.color = color

    # 重写speak方法
    def speak(self):
        return "Meow"

    # Cat类特有的方法
    def nap(self):
        return f"{self.name} is napping."


# 创建Dog和Cat类的实例
my_dog = Dog("Rex"5"German Shepherd")
my_cat = Cat("Whiskers"3"Tabby")

# 类和实例方法的使用
print(my_dog.introduce())  # 继承自Animal类
print(my_dog.speak())      # 输出: Woof Woof
print(my_dog.fetch("ball"))  # Dog类特有的方法

print(my_cat.introduce())   # 继承自Animal类
print(my_cat.speak())       # 输出: Meow
print(my_cat.nap())         # Cat类特有的方法

# 类变量的访问
print(f"{my_dog.name} is part of the kingdom {Dog.kingdom}")
print(f"{my_cat.name} is part of the kingdom {Cat.kingdom}")

在这个例子中,我们定义了一个Animal基类,它包含了所有动物共有的特性和行为,如introduce方法。我们定义了一个抽象方法speak,它需要在子类中得到实现。DogCat类继承了Animal基类,并实现了各自的speak方法。它们也引入了一些新的属性,比如breedcolor,以及新的方法fetchnap

通过这个综合示例,我们展示了类和对象的定义、继承、多态以及类和实例变量的使用。这个例子是一个很好的起点,可以根据需要扩展更多的功能和复杂性。

理解面向对象编程(OOP)

面向对象编程(OOP)是一种编程模式,它将问题分解为一系列互相交互的“对象”。你可以将它看作是一种模仿现实世界的方法。

想象一下,你的生活就像一个大型的程序。在这个程序中,每个人和物品都可以是一个“对象”。在现实生活中,每个对象都有它的特征和行为。比如说,一辆自行车,它的特征包括它的颜色、尺寸和品牌,而它的行为可能是骑行、刹车和转向。

在面向对象编程中,我们会用代码来定义每一个对象:

  • 类(Class) :这就像是一个创建对象的蓝图。比如说,你可以有一个名为Bicycle的类,这个类定义了自行车都有哪些特征(颜色、尺寸、品牌)和行为(骑行、刹车、转向)。
  • 对象(Object) :根据类创建的实例。如果类是蓝图,那么对象就是根据这个蓝图建造出来的房子。例如,你可以用Bicycle类来创建一个特定的自行车对象,这个对象有着特定的颜色、尺寸和品牌。
  • 属性(Attributes) :这些是对象的特征。使用前面的自行车例子,属性就是具体的颜色、尺寸和品牌。
  • 方法(Methods) :这些是对象可以执行的行为。在自行车的例子里,方法可以是骑行、刹车和转向。

通过面向对象的方法,我们可以创建多个不同的自行车对象,每个对象都有自己的属性和方法。这就像在现实世界中,每辆自行车都可能有不同的特点,但所有自行车都能够执行相同的基本动作。

这种方法的一个主要优点是它可以使我们的代码更加有组织,易于管理。我们可以对相似的对象进行分组处理,这样在处理类似对象时就不需要重复编写代码。还可以让我们的程序更容易扩展和维护,因为我们可以单独修改一个对象的类定义,而不必在整个程序中寻找并更改每个相关的部分。

总结一下,面向对象编程就是一个模拟现实世界中对象和他们行为的方法,让我们能够以一种清晰和有组织的方式编写代码。

这个教程仅仅触及了面向对象编程中类与对象的基础。随着你对Python和面向对象编程的探索深入,你将了解到更复杂的概念,比如封装、抽象、组合以及更多的设计模式。不过,掌握这些基础是非常重要的,它们是构建健壮和可维护代码的基础。