Python面向对象编程之类的进阶

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 类的实例化

类实例化是指创建一个类的对象,我们使用关键字newcreate或类名后面加上一对圆括号()来实现。一个类可以创建多个不同的对象。

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编程中的面向对象思想和方法,从而使我们的编程更加高效、可维护和可扩展。

后端开发标签