面向对象编程介绍
面向对象编程:Object Oriented Programming,简称OOP,是一种程序设计思想。 需要注意的是,与之对应的是面向过程编程思想。实际上,能够使用面向对象编程思想实 现的程序,也都能通过面向过程完成。只是看哪种思想更适合当前开发需求。
面向过程与面向对象区别
面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装。减少重复代码的重写过程
类和对象
一个类是一个数据类型,包含了属性和方法。类是无法直接使用的,需要通过创建对象来使用。一个对象是类的一个实例,具有类定义的属性和方法。在Python中,可以使用class
关键字来定义一个类。
以下是一个简单的类:
class Dog:
# 初始化方法
def __init__(self, name, age):
self.name = name
self.age = age
# 方法
def bark(self):
print(f'{self.name} is barking!')
# 创建对象
my_dog = Dog('Tommy', 2)
# 调用方法
my_dog.bark()
这个类叫做Dog
,它有两个属性:name
和age
;同时还有一个方法叫做bark()
,用于打印一段狗吠声。通过__init__()
方法初始化对象时,需要传递name
和age
参数。在上面的示例中,我们创建了一个名为my_dog
的对象,并调用了它的bark()
方法。
常用方法
__init__()
__init__()
方法在创建一个对象时会调用,用于初始化实例对象的属性。这个方法接受很多参数,其中第一个参数永远是self
,表示实例对象本身。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person = Person('John', 22)
print(person.name, person.age) # John 22
继承
继承是面向对象编程中的一种重要概念。可以使用继承来创建一个类,新类将继承所父类的所有属性和方法。子类可以修改父类的属性和方法,并且可以添加新的属性和方法。
以下是一个简单的继承示例:
# 父类
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
print(f'{self.name} is eating!')
# 子类
class Dog(Animal):
def __init__(self, name, age):
super().__init__(name)
self.age = age
def bark(self):
print(f'{self.name} is barking!')
# 创建对象
my_dog = Dog('Tommy', 2)
# 调用方法
my_dog.eat()
my_dog.bark()
这个示例中定义了两个类:Animal
和Dog
。Dog
类继承了Animal
类的属性和方法,包括__init__()
和eat()
。子类可以使用super()
函数来调用父类的__init__()
方法。在这个示例中,我们创建了一个名为my_dog
的Dog
对象,并调用了它的eat()
和bark()
方法。由于Dog
类继承了Animal
类的eat()
方法,因此这个方法可以被Dog
对象调用。
封装
在Python中,可以使用封装来隐藏类的属性和方法,以保证类的安全性。通过封装,我们可以防止外部程序意外访问类的属性和方法。在Python中,可以通过定义私有变量和方法来实现封装。
以下是一个简单的封装示例:
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('Insufficient balance')
def get_balance(self):
return self.__balance
# 创建对象
my_account = BankAccount(100)
# 调用方法
my_account.deposit(50)
my_account.withdraw(30)
# 访问属性
print(my_account.get_balance())
这个示例中,BankAccount
类有一个私有属性__balance
,以及三个方法:deposit()
、withdraw()
和get_balance()
。在上面的代码中,我们创建了一个名为my_account
的BankAccount
对象,并对它进行了一些操作,最后输出了它的余额。由于__balance
是一个私有变量,因此外部程序无法直接
多态
多态是面向对象的三大特性之一,通过在父类中定义方法,并在子类中重写这个方法,实现不同的行为。多态增加了代码的灵活性和可维护性。
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print("I'm an animal")
class Dog(Animal):
def __init__(self, name):
super().__init__(name)
def speak(self):
print("I'm a dog")
class Cat(Animal):
def __init__(self, name):
super().__init__(name)
def speak(self):
print("I'm a cat")
def animal_speak(animal):
animal.speak()
animals = [Dog('Tommy'), Cat('Lucy')]
for animal in animals:
animal_speak(animal)
__str__()
和 __repr__()
__str__()
和__repr__()
方法都返回一个字符串,用于表示对象。__str__()
用于输出简洁的字符串表示,而__repr__()
方法输出详细的字符串表示,可以用于调试和开发。
class MyClass:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name} is {self.age} years old"
def __repr__(self):
return f"MyClass('{self.name}', {self.age})"
mc = MyClass('John', 22)
print(str(mc)) # John is 22 years old
print(repr(mc)) # MyClass('John', 22)