1.什么是面向对象(OOP)
面向对象(OOP)是一种程序设计思想,它把数据和对数据的操作封装在一起,使得重用性、灵活性和扩展性都更加强大。
Python是一种完全支持面向对象编程的语言,它使用了类(class)和对象(object)的概念,以及继承、封装和多态等特性来实现面向对象编程。
2.类和对象
2.1类的定义
在Python中,我们使用关键字class来定义一个类。一个类可以包含属性和方法,类中的属性和方法可以通过对象来访问。
class Person:
name = "Tom"
age = 20
def print_info(self):
print("Name:", self.name)
print("Age:", self.age)
这段代码中,我们定义了一个Person类,它有两个属性name和age,以及一个方法print_info。在方法print_info中,我们使用了self关键字,它代表一个对象,可以用来访问对象的属性。
2.2对象的创建
要创建一个对象,我们需要使用类名加上括号的方式来调用类的构造函数(__init__方法)。下面是一个例子:
person1 = Person()
person1.print_info()
这段代码中,我们创建了一个名为person1的Person对象,并通过调用print_info方法来访问对象的属性name和age。
2.3属性的访问
在类中定义的属性和方法都可以通过对象来访问,属性的访问使用点号(.)符号来连接。下面是一个例子:
person1.name = "Bob"
person1.age = 30
person1.print_info()
这段代码中,我们修改了person1对象的属性name和age,并通过调用print_info方法来验证修改结果。
2.4方法的调用
方法的调用同样使用点号(.)符号来连接。下面是一个例子:
person2 = Person()
person2.name = "Alice"
person2.print_info()
这段代码中,我们创建了一个名为person2的Person对象,通过修改属性name的值,再调用print_info方法来验证结果。
3.继承
Python中支持继承,继承是面向对象编程中非常重要的一种特性,它允许我们在已有的类基础上,创建一个新的类,同时保留父类的特性。
3.1父类和子类
在Python中,我们使用关键字class来定义一个类,继承是通过在类名后面加上小括号,并在小括号中指定父类的名称来实现的。下面是一个例子:
class Student(Person):
grade = 3
def print_grade(self):
print("Grade:", self.grade)
这段代码中,我们定义了一个Student类,它继承自Person类,并添加了一个新的属性grade和一个新的方法print_grade。
3.2子类的使用
使用子类时,只需要创建一个子类的对象即可,这个对象可以访问父类和子类中定义的属性和方法。下面是一个例子:
student1 = Student()
student1.name = "Alice"
student1.age = 18
student1.print_info()
student1.print_grade()
这段代码中,我们创建了一个名为student1的Student对象,并访问了父类Person和子类Student中定义的属性和方法。
4.封装
封装是一种将数据和操作数据的方法放在一起的编程概念。在现实世界中,我们执行一个操作时,往往只需要知道如何调用执行就可以了,却并不需要了解这个操作的具体实现过程。
在面向对象编程中,我们使用访问控制和属性来实现封装。
4.1访问控制
Python中通过下划线来表示访问控制的作用,下划线有三种类型:
单下划线(_):表示不应该被外部直接访问的属性或方法,但可以被子类或派生类访问。
双下划线(__):表示私有属性或方法,不能被外部访问,也不能被子类或派生类访问。
双下划线开头且没有双下划线结尾(___):这种属性是系统定义的特殊方法或属性,对Python解释器有特殊含义。
4.2属性
在Python中,我们使用@property装饰器来定义属性,它将一个方法装饰成一个属性,对属性进行访问时会调用这个方法。
class Temperature:
def __init__(self, value=0.0):
self._value = value
@property
def value(self):
return self._value
@value.setter
def value(self, value):
if value < -273.15:
raise ValueError("Temperature value too low.")
self._value = value
这段代码中,我们定义了一个Temperature类,它有一个属性value,我们使用@property装饰器来定义这个属性,并在value方法中进行属性的读取和设置操作。
4.3属性的访问
通过上面的@property装饰器,我们可以像访问普通属性一样访问这个属性:
t = Temperature(20)
print(t.value)
t.value = 30
print(t.value)
这段代码中,我们创建了一个名为t的Temperature对象,并通过直接访问属性value来获取和设置属性value的值。
5.多态
多态是一种同一种操作作用于不同的对象上,产生不同结果的情况,这种特性可以增加代码的复用性和灵活性。
在Python中,我们可以通过方法重载和方法重写实现多态。
5.1方法重载
在Python中,方法重载指的是在一个类中定义多个方法名相同但参数不同的方法。下面是一个例子:
class Math:
def add(self, x, y):
return x + y
def add(self, x, y, z):
return x + y + z
m = Math()
print(m.add(1, 2))
print(m.add(1, 2, 3))
这段代码中,我们定义了一个Math类,它有两个方法名相同但参数不同的方法add。在进行方法调用的时候,Python会根据传入的参数自动调用对应的方法。
5.2方法重写
在Python中,方法重写指的是子类对父类同名方法的重新实现。下面是一个例子:
class Animal:
def speak(self):
print("I am an animal.")
class Cat(Animal):
def speak(self):
print("I am a cat.")
class Dog(Animal):
def speak(self):
print("I am a dog.")
a = Animal()
c = Cat()
d = Dog()
a.speak()
c.speak()
d.speak()
这段代码中,我们定义了一个Animal类和两个子类Cat和Dog,子类分别对父类的方法speak进行了重新实现。在进行方法调用的时候,Python会根据对象的类型自动调用对应的方法。
6.总结
本文主要介绍了Python面向对象编程(OOP)中的基本概念,包括类和对象、继承、封装和多态等特性。对于面向对象编程初学者来说,掌握这些基本概念是非常重要的,它们可以让程序代码更加灵活、可读性更高、复用性更强。