面向对象编程(Object-Oriented Programming, OOP)
是一种编程范式,它使用基于对象的方式来组织代码。Python 的面向对象编程可以使用 Class 来实现。Class 是 Python 中面向对象编程的核心,它可以实现面向对象编程中的封装、继承和多态等特性。
一、创建 Class
要定义一个 Class,可以使用 class
关键字。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
以上代码定义了一个名为 Person
的 Class,该 Class 有两个属性:name
和 age
。__init__
方法是 Class 的构造函数,当创建 Class 对象时会自动调用该方法,self
参数代表对象本身。可以通过如下代码创建一个 Person
对象:
person = Person("Jack", 30)
print(person.name) # 输出 Jack
print(person.age) # 输出 30
该代码会创建一个名为 person
的对象,同时输出 person
对象的 name
和 age
属性。
二、继承与多态
继承是指新的 Class 可以基于现有 Class 创建。Python 支持单继承和多重继承。 在继承时,新的 Class 被称为子类(Subclass),已有 Class 被称为父类(Superclass)。子类会自动继承父类的属性和方法,并且可以重写、添加或删除这些属性和方法。
class Student(Person):
def __init__(self, name, age, grade):
super().__init__(name, age)
self.grade = grade
def study(self):
print(self.name, "is studying in grade", self.grade)
student = Student("Tom", 18, 12)
print(student.name) # 输出 Tom
print(student.age) # 输出 18
print(student.grade) # 输出 12
student.study() # 输出 Tom is studying in grade 12
以上代码定义了一个名为 Student
的子类,该子类继承了 Person
父类的 name
和 age
属性,并添加了一个 grade
属性和 study
方法。可以通过如下代码创建一个 Student
对象:
该代码会创建一个名为 student
的对象,输出 student
对象的 name
、age
和 grade
属性,同时调用 student
对象的 study
方法。
多态是指在继承关系中,子类可以使用父类定义的方法,但是可以自己定义该方法的实现,也可以使用父类已定义的方法实现。这样,在不同的情况下,子类可以使用自己的方法实现,父类方法的实现也可以被使用。
三、封装
封装是指把代码和数据包装在一起,以便于隐藏内部实现细节。Python 中,可以使用公开、私有和受保护的访问修饰符来实现封装。 公开访问修饰符用于定义公共属性和方法,可以通过 Class 的对象来访问它们。
class Car:
def __init__(self, color):
self.color = color
def start(self):
print("The car is starting...")
car = Car("red")
print(car.color) # 输出 red
car.start() # 输出 The car is starting...
以上代码定义了一个名为 Car
的 Class,该 Class 有一个公共属性 color
和一个公共方法 start
。可以通过如下代码创建一个 Car
对象:
该代码会创建一个名为 car
的对象,输出 car
对象的 color
属性,并调用 car
对象的 start
方法。
私有访问修饰符用于定义私有属性和方法,可以在 Class 内部访问它们,但是无法在 Class 的外部访问它们。
class BankAccount:
def __init__(self, balance):
self.__balance = balance
def deposit(self, amount):
self.__balance += amount
def withdraw(self, amount):
if amount <= self.__balance:
self.__balance -= amount
else:
print("Not enough balance")
account = BankAccount(1000)
account.deposit(500)
account.withdraw(2000) # 不足 2000 的余额,将输出 Not enough balance
以上代码定义了一个名为 BankAccount
的 Class,该 Class 有一个私有属性 balance
,以及两个公共方法 deposit
和 withdraw
。私有属性 balance
可以通过双下划线加变量名的方式定义。
可以通过如下代码创建一个 BankAccount
对象,并分别调用它的 deposit
和 withdraw
方法。由于 balance
属性是私有的,无法在 Class 的外部直接访问该属性。
受保护访问修饰符用于定义受保护的属性和方法,可以在 Class 及其子类中访问它们,但是无法在 Class 的外部访问它们。
class Animal:
def __init__(self, name, species):
self._name = name
self._species = species
def _eat(self):
print(self._name, "is eating...")
class Dog(Animal):
def __init__(self, name, breed):
super().__init__(name, "Dog")
self._breed = breed
def bark(self):
print(self._name, "is barking...")
dog = Dog("Charlie", "Golden Retriever")
dog.bark() # 输出 Charlie is barking...
dog._eat() # 输出 Charlie is eating...
以上代码定义了一个名为 Animal
的 Class 和一个名为 Dog
的子类。Animal
Class 有两个受保护的属性 _name
和 _species
,以及一个受保护的方法 _eat
。Dog
Class 继承了 Animal
Class,并添加了一个受保护的属性 _breed
和一个公共方法 bark
。在子类中可以通过 self._name
访问父类的受保护属性 _name
,输出 dog
对象的 name
属性,同时调用 dog
对象的 bark
和 _eat
方法。