1. 简介
Python是一门面向对象的编程语言,面向对象编程(Object Oriented Programming,简称OOP)是Python编程中非常重要的一部分。在面向对象编程的过程中,我们将程序的各个部分组织成对象,这样的编程方法使得程序更加容易扩展、维护和重用。
1.1 什么是面向对象编程
面向对象编程是一种编程范式,它将程序看作是由一系列对象组成的。每个对象包括数据和行为,数据部分负责存储对象的状态,行为部分负责定义对象的操作。
1.2 为什么要学习面向对象编程
面向对象编程方法可以对程序进行模块化,使得程序具有更好的可维护性、可重用性和可扩展性。
2. 类的定义和实例化
2.1 类的定义
在Python中,我们使用关键字class
定义一个新的类。类的定义包括类名、类属性和类方法。
class MyClass:
"""这是一个类的注释"""
class_attribute = '类属性的值'
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
def class_method(self):
"""类方法的注释"""
return '类方法的返回值'
上述例子中,我们定义了一个名为MyClass
的类。类的注释可以使用三个双引号进行定义,类属性class_attribute
定义在类中,但是在方法之外。类的方法我们使用关键字def
进行定义,方法中第一个参数通常是self
,表示对象本身。构造方法在Python中使用__init__
方法进行定义。
2.2 类的实例化
类实例化是指创建一个类的对象,我们使用关键字new
、create
或类名后面加上一对圆括号()
来实现。一个类可以创建多个不同的对象。
class MyClass:
"""这是一个类的注释"""
class_attribute = '类属性的值'
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
def class_method(self):
"""类方法的注释"""
return '类方法的返回值'
obj1 = MyClass('参数1', '参数2')
obj2 = MyClass('参数3', '参数4')
通过类定义实例化出来的对象,我们可以访问类属性和类方法。
class MyClass:
"""这是一个类的注释"""
class_attribute = '类属性的值'
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
def class_method(self):
"""类方法的注释"""
return '类方法的返回值'
obj1 = MyClass('参数1', '参数2')
obj2 = MyClass('参数3', '参数4')
print(obj1.class_attribute)
print(obj2.class_method())
运行上述代码,会输出:
类属性的值
类方法的返回值
3. 继承和多态
3.1 继承
在Python中,我们可以通过继承来扩展一个类。子类继承父类,子类可以使用父类的属性和方法,并可以拥有自己的属性和方法。
class ParentClass:
"""父类的注释"""
parent_attribute = '父类属性的值'
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
def parent_method(self):
"""父类方法的注释"""
return '父类方法的返回值'
class ChildClass(ParentClass):
"""子类的注释"""
child_attribute = '子类属性的值'
def __init__(self, arg1, arg2, arg3):
ParentClass.__init__(self, arg1, arg2)
self.arg3 = arg3
def child_method(self):
"""子类方法的注释"""
return '子类方法的返回值'
上述代码中,我们定义了一个名为ParentClass
的父类和一个名为ChildClass
的子类。
子类ChildClass
继承了父类ParentClass
,因此可以使用父类的属性和方法。子类中可以添加自己的属性和方法。
3.2 多态
多态是指同一方法或属性在不同对象上的行为是不同的。在Python中,我们可以通过继承来实现多态。子类可以重写父类的方法,从而实现不同对象上的行为不同。
class ParentClass:
"""父类的注释"""
parent_attribute = '父类属性的值'
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
def parent_method(self):
"""父类方法的注释"""
return '父类方法的返回值'
class ChildClass(ParentClass):
"""子类的注释"""
child_attribute = '子类属性的值'
def __init__(self, arg1, arg2, arg3):
ParentClass.__init__(self, arg1, arg2)
self.arg3 = arg3
def parent_method(self):
"""重写父类的方法"""
return '子类中重写父类方法的返回值'
上述代码中,子类ChildClass
重写了父类ParentClass
中的方法parent_method
。在子类中,方法的行为与父类中的不同。
4. 封装和访问权限
4.1 封装
面向对象编程中,封装是指将对象的属性和方法隐藏起来,以保护对象的数据不被外界访问或篡改。在Python中,我们使用下划线_
或双下划线__
来表示属性或方法的访问权限。
下划线_
表示该属性或方法是私有的,应该只能在类的内部访问;双下划线__
表示该属性或方法是特殊的,Python会将其名称重命名以防止与子类中重写的同名属性或方法冲突。
class MyClass:
"""这是一个类的注释"""
_private_attribute = '私有属性的值'
__special_attribute = '特殊属性的值'
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
def public_method(self):
"""公有方法的注释"""
return '公有方法的返回值'
def _private_method(self):
"""私有方法的注释"""
return '私有方法的返回值'
def __special_method(self):
"""特殊方法的注释"""
return '特殊方法的返回值'
上述代码中,我们定义了类MyClass
,包括公有属性、私有属性、特殊属性、公有方法、私有方法和特殊方法。
4.2 属性和方法的访问权限
属性和方法的访问权限取决于下划线和双下划线的使用。如果属性或方法的名称以双下划线__
开头,Python会将其名称重命名以防止与子类中重写的同名属性或方法冲突。如果属性或方法的名称以一个下划线_
开头,Python会认为这是一个私有属性或私有方法,应只能在类的内部使用。但是,Python并没有真正限制访问,仍然可以通过对象名或类名来访问私有属性或私有方法。
class MyClass:
"""这是一个类的注释"""
_private_attribute = '私有属性的值'
__special_attribute = '特殊属性的值'
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
def public_method(self):
"""公有方法的注释"""
return '公有方法的返回值'
def _private_method(self):
"""私有方法的注释"""
return '私有方法的返回值'
def __special_method(self):
"""特殊方法的注释"""
return '特殊方法的返回值'
mc = MyClass('参数1', '参数2')
print(mc.arg1)
print(mc._private_attribute)
print(mc._MyClass__special_attribute)
print(mc._private_method())
print(mc._MyClass__special_method())
运行上述代码,会输出:
参数1
私有属性的值
特殊属性的值
私有方法的返回值
特殊方法的返回值
我们可以看到,通过下划线的使用,属性和方法的访问权限得到了限制,但并不是完全无法访问。
5. 多重继承
多重继承是指一个类可以继承多个父类,从而获得多个父类的属性和方法。
class ParentClass1:
"""父类1的注释"""
parent_attribute1 = '父类1属性的值'
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
def parent_method1(self):
"""父类1方法的注释"""
return '父类1方法的返回值'
class ParentClass2:
"""父类2的注释"""
parent_attribute2 = '父类2属性的值'
def parent_method2(self):
"""父类2方法的注释"""
return '父类2方法的返回值'
class ChildClass(ParentClass1, ParentClass2):
"""子类的注释"""
child_attribute = '子类属性的值'
def __init__(self, arg1, arg2, arg3):
ParentClass1.__init__(self, arg1, arg2)
self.arg3 = arg3
def child_method(self):
"""子类方法的注释"""
return '子类方法的返回值'
上述代码中,我们定义了一个名为ChildClass
的子类,它继承自父类ParentClass1
和父类ParentClass2
。
在多重继承中,如果两个或更多的父类包含同名属性或方法,在子类中就会出现冲突。为此,Python提供了super()
函数,用于解决多重继承中的命名冲突。
6. 魔术方法
在Python中,魔术方法是指以__
开头和以__
结尾的特殊方法。它们用于调用对象内部的某些特定方法或处理特定事件。比如,__init__
方法是一个构造函数,用于创建对象。
以下是一些常用的魔术方法:
__init__
: 构造函数,在创建对象时调用
__call__
: 对象被调用时调用
__str__
: 将对象转换为字符串时调用
__add__
: 加法操作,使用"+"运算符时调用
__sub__
: 减法操作,使用"-"运算符时调用
__mul__
: 乘法操作,使用"*"运算符时调用
__div__
: 除法操作,使用"/"运算符时调用
7. 总结
本文介绍了Python面向对象编程的一些基本概念,包括类的定义和实例化、继承和多态、封装和访问权限、多重继承和魔术方法。学习这些概念可以帮助我们更好地理解Python编程中的面向对象思想和方法,从而使我们的编程更加高效、可维护和可扩展。