面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它以对象为核心来构建程序。这些对象不仅模拟现实世界中的实体,还代表抽象概念。在OOP中,程序被组织成一个对象的集合,这些对象通过消息传递的方式进行交互和协作。
类是面向对象编程的基础,可以看作是创建对象的模型,它是一个抽象的模板或蓝图,用于定义对象的属性(成员变量)和方法(成员函数)。
对象是类的实例化,它是类的具体实体,具有类定义的属性和行为,且每个对象都有自己的状态和行为。
类是一种抽象概念,假设我们定义Student类,是指学生这个概念,而实例则是每个具体的学生,比如小明和小红。所以,面向对象的设计思想是抽象出类,根据类创建实例。
面向对象编程主要有以下特性:
封装:封装是将数据(属性)和对数据的操作(方法)组合在一起。这样,对象的行为与其状态是紧密结合的,有助于隐藏对象的内部状态,只通过定义好的接口与外界交互。封装就像是把一个物品放进盒子里,只允许通过盒子上的小窗口与物品交互。盒子的作用是保护物品,防止外部直接与之接触。在面向对象编程中,类就是那个盒子,属性(成员变量)和方法(成员函数)就是物品,通过将属性私有化(在Python中使用双下划线前缀)和提供公共方法(getter和setter)来实现封装。这样,只有通过类的公共接口(方法)才能访问和修改属性,从而控制了属性的访问和修改权限,防止了直接的外部干预。
继承:继承是从已有的类派生出新的类。新类继承了原始类的属性和方法,同时还可以添加新的特性和行为,或者覆盖和修改已有的行为。继承就像是家族中的传承,父辈将财产、知识和特征传给子辈,子辈可以继承父辈的东西,并在此基础上进行扩展或修改。在面向对象编程中,父类就像是一个模板,子类继承父类的属性和方法。子类可以保留父类的特征,同时添加自己的特征或覆盖父类的方法,实现了代码的重用和扩展。
多态:多态是指允许一个接口多种形态存在的能力。在面向对象编程中,多态允许使用相同的操作来处理不同的对象类型,增强了代码的可重用性和灵活性。多态就像是不同的音乐家演奏相同的乐曲,每个音乐家以自己的方式演绎,但最终的结果是同一首乐曲,听众可以欣赏到不同的表现。在面向对象编程中,多态允许不同的类以相同的方式响应相同的方法名,不同的子类可以实现相同的方法名,但表现出不同的行为,这使得我们可以根据实际对象来调用方法,而无需关心具体的实现,具有灵活性。
Python 使用 __ 开头的名字来定义特殊的方法和属性,具体而言包括:__init__()
、__repr__()
、__str__()
、__call__()
、__iter__()
、__add__()
、__sub__()
、__mul__()
、__rmul__()
、__class__
、__name__
,以及构造方法 __init__()
。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print(f"My name is {self.name} and I am {self.age} years old.")
# 创建对象
person1 = Person("Alan", 30)
person2 = Person("Bob", 25)
# 调用对象的方法
person1.introduce()
person2.introduce()
class Clothes(object):
def __init__(self, price):
self.price = price
# 这样 discount_price 就变成属性了
@property
def discount_price(self):
return self.price * 0.8
# 使用相应的 @attr.setter 修饰符使属性变成可写的
@discount_price.setter
def discount_price(self, new_price):
self.price = new_price * 1.25
my_clothes = Clothes(100)
print(my_clothes.discount_price) # 80.0
# 修改price属性来改变discount_price
my_clothes.price = 200
print(my_clothes.discount_price) # 160.0
Python使用__init__
方法来初始化对象的属性,并使用self参数引用对象本身。属性通常是在__init__
方法中初始化,然后通过点操作符访问。
class Student(Person):
def __init__(self, name, age, student_id):
super().__init__(name, age)
self.student_id = student_id
def introduce(self):
print(f"My name is {self.name}, I am {self.age} years old, and my student ID is {self.student_id}.")
student = Student("Charlie", 20, "12345")
student.introduce()
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
def animal_sound(animal):
return animal.speak()
dog = Dog()
cat = Cat()
print(animal_sound(dog)) # "Woof!"
print(animal_sound(cat)) # "Meow!"
Python的面向对象编程并不难,如果你会C++的面向对象编程,只需要类比即可。OOP以对象为核心,目的是使用更合理的方式组织和管理代码,就像在现实生活中有序、规则化处理物品一样,可以把对象看作是具有属性和行为的事物,通过封装来隐藏内部细节,通过继承来共享和扩展功能,通过多态来实现不同对象的通用接口。在实际的编程中,可以根据情况使用OOP,而不要为了OOP而OOP,毕竟OOP是众多设计思想中的一种。如果单纯将OOP作为某种教条就违反了该思想设计的初衷,最终也只是徒增代码复杂度。