Python面向对象编程入门:封装、继承与多态详解
本文系统讲解Python面向对象编程的核心概念,涵盖封装、继承与多态三大特性。详细阐述如何通过双下划线实现私有化,利用property函数访问私有属性,以及通过self参数理解对象内存封装机制。同时介绍继承在代码复用中的作用,帮助初学者建立完整的OOP知识体系。
前言
近期深入学习了Python的面向对象编程(OOP)模式。由于此前未接触过其他面向对象语言,这一学习过程极具挑战性且充满乐趣,现将相关知识点整理如下以供参考。
概述
- Python支持多种编程范式,包括面向过程、面向对象以及面向切面(如装饰器相关技术)等。
- 面向过程编程:依据业务逻辑,从上至下逐步编写代码。
- 函数式编程:将特定功能代码封装至函数中,后续无需重复编写,仅需调用该函数即可。
- 面向对象编程:对函数进行分类与封装,旨在实现“更快、更好、更强”的开发目标。
OOP思想
- 面向对象的基本哲学认为:世界由具有各自运动规律和内部状态的对象组成,对象之间的相互作用与通信构成了整个世界。
- 唯一性:世间没有两片完全相同的树叶,同样也不存在完全相同的对象。
- 分类性:分类是对现实世界的一种抽象处理。
- 三大特性:封装、继承和多态。
面向对象的三大特性具体包括:
一、封装
封装是对具体对象的一种抽象处理,即将部分细节隐藏起来,在程序外部不可见,从而无法直接调用。
私有化:将类或函数中的某些属性限制在特定区域内,使得外部无法直接访问。
Python中实现私有化的方法较为简单,即在准备私有化的属性(包括方法和数据)名称前添加双下划线。
例如:
class ProtectMe(object):
def __init__(self):
self.me = "qiwsir"
self.__name = "kivi"
def __python(self):
print("I love Python.")
def code(self):
print9"Which language do you like?")
self.__python()
if __name__ == "__main__":
p = ProtectMe()
print(p.me)
print(p.__name)
#运行结果
qiwsir
Traceback (most recent call last):
File "21102.py", line 21, in <module>
print p.__name
AttributeError: 'ProtectMe' object has no attribute '__name'
说明:__name属性已被隐藏,无法直接调用。
若需调用私有属性,可以使用@property函数。
class ProtectMe(object): def __init__(self): self.me = "qiwsir" self.__name = "kivi" @property def name(self): return self.__name if __name__ == "__main__": p = ProtectMe() print(p.name) #运行结果 kivi
因此,在使用面向对象的封装特性时,需要执行以下操作:
- 将内容封装到指定位置
- 从指定位置调用被封装的内容
第一步:将内容封装到某处

self是一个形式参数,当执行 obj1 = Foo('wupeiqi', 18 ) 时,self的值等于obj1。
当执行 obj2 = Foo('alex', 78 ) 时,self的值等于obj2。
因此,内容实际上被封装到了对象obj1和obj2中,每个对象内部都包含name和age属性,在内存中的存储结构大致如下图所示。

第二步:从某处调用被封装的内容
调用被封装的内容时,存在两种情况:
- 通过对象直接调用
- 通过self间接调用
class Role(object):
ac = None #类变量
def __init__(self,name,role,weapon,life_value):
#初始化方法
self.name = name #实例变量(成员变量)
self.role = role
self.weapon = weapon
self.life_val = life_value
def buy_weapon(self,weapon): #定义方法
#self:表示实例本身
self.weapon = weapon
# print("%s is buying [%s]" %(self.name,weapon))
#把一个抽象的类变成一个具体的对象的过程,叫实例化
p1 = Role("sanjiang",'Police',"B10",90) #实例
t1 = Role("Chunyun",'Terrorist',"B11",100)
二、继承
继承是面向对象中的重要概念,与现实生活中的继承类似,即子类可以继承父类的属性和方法。
class SchoolMember(object):
# member_nums = 0
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
# self.enroll()
def enroll(self):
SchoolMember.member_nums += 1
print("SchoolMember [%s] is enrolled!" %self.name)
def tell(self):
print("Hello my name is [%s]" %self.name)
class Teacher(SchoolMember):
def __init__(self,name,age,sex,course,salary): #重写父类的__init__方法
super(Teacher,self).__init__(name,age,sex) #继承(新式类)
# SchoolMember.__init__(self,name,age,sex) #继承(旧式类)
self.course = course
self.salary = salary
def teaching(self):
print("Teacher [%s] is teaching [%s]" %(self.name,self.course))
class Student(SchoolMember):
def __init__(self,name,age,sex,course,tuition):
super(Student,self).__init__(name,age,sex)
self.course = course
self.tuition = tuition
def pay_tuition(self):
print("ca,student [%s] paying tuition [%s] again" %(self.name,self.tuition))
总结
以上就是本文的全部内容,希望这些内容能对大家的Python学习或工作有所帮助。如有任何疑问,欢迎留言交流。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









