面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它使用“对象”来设计软件。这些对象是类的实例,类定义了对象的属性和行为。Python 是一种支持面向对象编程的语言,本章将详细介绍如何在 Python 中实现面向对象编程。
类与对象
定义类
在 Python 中,可以使用 class 关键字定义一个类。类定义通常包括属性(数据成员)和方法(函数成员)。下面是一个简单的类定义示例:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
print(f"Hello, my name is {self.name} and I'm {self.age} years old.")在这个例子中,我们定义了一个名为 Person 的类,它有两个属性:name 和 age。类中还定义了一个方法 greet,用于输出问候语。
创建对象
一旦定义了类,就可以创建该类的对象。每个对象都是类的一个实例。例如:
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)
person1.greet() # 输出: Hello, my name is Alice and I'm 30 years old.
person2.greet() # 输出: Hello, my name is Bob and I'm 25 years old.类属性与实例属性
类属性
类属性是在类级别定义的属性,所有实例共享相同的类属性。类属性可以通过类名或实例名访问。定义类属性时,通常将其放在类定义的顶部。
// www.javascriptcn.com code example
class Person:
species = "Homo sapiens" # 类属性
def __init__(self, name, age):
self.name = name # 实例属性
self.age = age # 实例属性
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)
print(Person.species) # 输出: Homo sapiens
print(person1.species) # 输出: Homo sapiens
print(person2.species) # 输出: Homo sapiens实例属性
实例属性是在类的 __init__ 方法或其他方法中定义的属性,每个实例都有自己的实例属性副本。实例属性的值可以因实例而异。
person1.species = "Homo neanderthalensis" print(Person.species) # 输出: Homo sapiens print(person1.species) # 输出: Homo neanderthalensis print(person2.species) # 输出: Homo sapiens
继承
继承允许我们定义一个从现有类派生的新类。新类称为子类或派生类,现有类称为基类或父类。子类继承父类的所有属性和方法,并且可以添加新的属性和方法,也可以覆盖父类的方法。
// www.javascriptcn.com code example
class Student(Person):
def __init__(self, name, age, school):
super().__init__(name, age) # 调用父类的构造方法
self.school = school
def study(self):
print(f"{self.name} is studying at {self.school}.")
student1 = Student("Charlie", 20, "MIT")
student1.greet() # 输出: Hello, my name is Charlie and I'm 20 years old.
student1.study() # 输出: Charlie is studying at MIT.封装
封装是面向对象编程的三大支柱之一,它是指将数据和操作数据的方法绑定在一起,作为一个整体进行考虑。封装有助于隐藏对象内部状态,只暴露有限的接口给外部使用。
私有属性
在 Python 中,可以使用双下划线 __ 开头的名称来定义私有属性,这样外部代码就不能直接访问这些属性。但是,通过 _classname__attrname 这种方式仍然可以间接访问这些私有属性。
// www.javascriptcn.com code example
class BankAccount:
def __init__(self, balance):
self.__balance = balance # 私有属性
def deposit(self, amount):
if amount > 0:
self.__balance += amount
def withdraw(self, amount):
if 0 < amount <= self.__balance:
self.__balance -= amount
def get_balance(self):
return self.__balance
account = BankAccount(1000)
account.deposit(500)
account.withdraw(200)
print(account.get_balance()) # 输出: 1300多态
多态是指允许不同类的对象对同一消息做出响应的能力。具体来说,多态允许我们调用相同的方法名,但根据实际的对象类型执行不同的方法实现。
// www.javascriptcn.com code example
class Dog:
def sound(self):
return "Woof!"
class Cat:
def sound(self):
return "Meow!"
def animal_sound(animal):
print(animal.sound())
dog = Dog()
cat = Cat()
animal_sound(dog) # 输出: Woof!
animal_sound(cat) # 输出: Meow!以上是面向对象编程的基础概念和示例,通过这些基础知识,你可以开始构建更复杂、更模块化的应用程序。下一节我们将深入探讨更多高级特性,如装饰器、元类等。