1. 面向对象基础
首先我们来谈谈什么是面向对象基础。面向对象基础是指一种编程思想,它主要是以对象作为程序的基本单元,以及对象之间的互动来完成任务。而Python是一种不区分基本数据类型和对象的语言,一切都是对象。
1.1 类和对象
在Python中,类是一种面向对象编程的基本结构。我们可以通过定义类创建对象,也可以通过类来访问其属性和方法。
定义一个类可以使用class关键字,其中包含类的名称和构造函数,构造函数通常称为__init__方法。在__init__方法中,我们定义对象的属性。
class Student:
def __init__(self,name,score):
self.name = name
self.score = score
上述类定义了一个名为Student的类,它有两个属性:name和score。接下来我们来创建一个Student对象:
s = Student('Tom',90)
上述代码将创建一个名为s的学生对象,他的名字是Tom,分数是90分。我们也可以访问对象属性:
print(s.name)
print(s.score)
在上述代码中,我们使用点号(.)来访问对象的属性。这里我们将输出:
Tom
90
1.2 继承
继承是指在现有类的基础上创建一个新类,新类将继承原有类的所有属性和方法。
创建子类时使用的class关键字后面跟着父类名即可。例如,我们创建一个新类Teacher,它将继承自Student类:
class Teacher(Student):
def __init__(self,name,score,subject):
super().__init__(name,score)
self.subject = subject
在上述代码中,我们使用了super()函数来调用父类的构造函数,这里Teacher类有一个额外的属性subject。
我们可以像以前一样创建一个新的Teacher对象,并访问它的属性:
t = Teacher('Bob',80,'Math')
print(t.name)
print(t.score)
print(t.subject)
这里我们将输出:
Bob
80
Math
1.3 多态
多态指的是在不同的情况下,同一个对象会表现出不同的形态和特征。在Python中,由于语言的动态特性,我们可以轻松地实现多态。
例如,我们定义一个可以打印任何对象的函数:
def print_info(obj):
print(obj.name)
print(obj.score)
s = Student('Tom',90)
t = Teacher('Bob',80,'Math')
print_info(s)
print_info(t)
在上述代码中,我们定义了一个函数print_info,它接受一个参数obj。由于Python不区分基本类型和对象,因此可以接受任何类型的参数。
在函数中我们调用了对象的属性name和score,由于Student和Teacher类都有这两个属性,因此我们可以将Student和Teacher的对象传递给该函数。
最后我们将输出:
Tom
90
Bob
80
2. 封装
封装是指将一个对象的属性和方法封装在一起,隐蔽对象的实现细节,提供公共接口供用户使用。在Python中,我们可以通过使用属性和方法的不同访问权限来实现封装。
2.1 属性访问权限
属性访问权限是指属性对外界的可见性。在Python中,属性只有两种访问权限:公共属性和私有属性。
公共属性是指可以从类的任何地方访问的属性。私有属性是指只能从类内部访问的属性,并且不能从类外部进行访问。
在Python中,我们可以通过在属性名称前面添加两个下划线来定义私有属性:
class Student:
def __init__(self,name,score):
self.name = name
self.__score = score
s = Student('Tom',90)
print(s.name)
print(s.__score)
在上述代码中,我们定义了一个名为__score的私有属性。试图访问该属性将会抛出AttributeError异常。
属性名称前面添加一个下划线表示属性是受保护的,可以被子类使用,但是不应该被直接访问。例如:
class Student:
def __init__(self,name,score):
self.name = name
self._score = score
class Teacher(Student):
def show_score(self):
print(self.name)
print(self._score)
t = Teacher('Bob',80)
t.show_score()
在上述代码中,我们使用一个下划线来定义受保护的属性_score。在Teacher类中,我们定义了一个方法show_score,该方法将访问父类的属性_name和受保护的属性_score。
2.2 方法访问权限
方法访问权限是指方法对外界的可见性。在Python中,方法也有两种访问权限:公共方法和私有方法。
公共方法是指可以从类的任何地方访问的方法。私有方法是指只能从类内部访问的方法,并且不能从类外部进行访问。
在Python中,我们可以通过在方法名称前面添加两个下划线来定义私有方法:
class Student:
def __init__(self,name,score):
self.name = name
self.score = score
def __show_score(self):
print(self.score)
s = Student('Tom',90)
s.__show_score()
在上述代码中,我们定义了一个名为__show_score的私有方法。试图访问该方法将会抛出AttributeError异常。
属性名称前面添加一个下划线表示方法是受保护的,可以被子类使用,但是不应该被直接访问。例如:
class Student:
def __init__(self,name,score):
self.name = name
self._score = score
def _show_score(self):
print(self._score)
class Teacher(Student):
def show_score(self):
print(self.name)
self._show_score()
t = Teacher('Bob',80)
t.show_score()
在上述代码中,我们使用一个下划线来定义受保护的方法_show_score。在Teacher类中,我们定义了一个方法show_score,该方法将访问父类的属性_name和受保护的方法_show_score。
3. 多重继承
多重继承是指一个类可以继承多个父类的属性和方法。在Python中,我们可以通过使用逗号分隔多个父类来实现多重继承。
例如,我们定义了两个父类:
class Person:
def __init__(self,name):
self.name = name
def show_name(self):
print(self.name)
class Age:
def __init__(self,age):
self.age = age
def show_age(self):
print(self.age)
然后我们定义一个子类,并继承这两个父类:
class Student(Person,Age):
def __init__(self,name,age):
Person.__init__(self,name)
Age.__init__(self,age)
s = Student('Tom',20)
s.show_name()
s.show_age()
在上述代码中,我们定义了一个名为Student的子类,它继承了Person和Age两个父类。在子类的构造函数中,我们调用了父类的构造函数,以便于初始化属性。
最后我们将输出:
Tom
20
4. 总结
本文主要介绍了Python面向对象编程中的基本语法,包括类和对象的定义、继承、多态和封装等概念。同时,我们也介绍了属性和方法的访问权限,以及多重继承的使用方法。
需要注意的是,在面向对象编程中,编写代码应该尽量避免使用全局变量,因为全局变量使得代码的维护变得困难。我们可以使用类属性和类方法来解决这个问题。
最后,请注意Python是一个非常灵活的语言,有很多不同的编程风格和设计模式。在实际编程中,我们应该选择正确的方式来编写代码,保持代码风格的一致性,以便于代码的维护和扩展。