浅析Python面向对象编程
作者:Alan.hsiang 发布时间:2023-11-23 07:52:12
概述
很多人接触Python,都是从爬虫开始,其实很多语言都可以做爬虫,只是Python相对其他语言来说,更加简单而已。但是Python并不止于爬虫,在人工智能,科学计算等方面的应用更加广泛。古人云:万丈高楼平地起,要想有长足的发展,打好基础很重要,本文主要讲解Python的面向对象相关知识,仅供学习分享使用,如有不足之处,还请指正。
面向对象的特征
类:用来描述相同事物的特征的集合,如:Person 类,表示人,具有人的属性和特征。
对象:通过类定义的具体的实例,如:zhangsan 表示一个具体的人。
继承:是指派生类继承基类的方法和属性,并具有自己属性和特征,如:Man是Person的子类。
封装:隐藏数据和实现细节,提供对外访问方法。
多态:一个基类,可以有多个派生类,可以有不同的形态。
抽象:抛开细节,只关注本质特征的过程。
以上是面向对象的基本特征,那么Python在面向对象方面是如何做的呢?
创建类
如下所示:
使用 class 语句来创建一个新类,class 之后为类的名称并以冒号结尾。
Python的类,没有大括号表示类的内容范围,而是通过缩进来实现。
类的成员方法和普通方法的区别是,方法定义的第一个参数是self,表示类的实例,但在调用时不需要。
其中__init__方法为类的初始化方法,当声明对象时,会调用对应的方法。
其中__del__方法为析构函数,当类被释放时调用。
class Employee:
"""员工类"""
emp_count = 0 # 变量是一个类变量,它的值将在这个类的所有实例之间共享
def __init__(self, name, salary):
"""初始化"""
self.name = name
self.salary = salary
Employee.emp_count += 1
def display_count(self):
"""显示数量"""
print('Total Employee =', Employee.emp_count)
def display_employee(self):
"""显示信息"""
print('name =', self.name, ', salary = ', self.salary)
def prt(self):
"""打印自己"""
print(self)
print(self.__class__)
def __del__(self):
"""析构函数"""
print(self, '被释放了')
创建对象
Python创建对象,不需要new关键字,类似于函数的调用,和Java及.Net不同。如下所示:
'创建第一个对象'
emp = Employee('Jack', 20)
emp.display_count()
emp.display_employee()
emp.prt()
动态添加与删除对象属性
对象的属性可以动态添加,这点与编译型语言不同,如下所示:
emp.age = 17 # 添加一个 'age' 属性
emp.age = 28 # 修改 'age' 属性
del emp.age # 删除 'age' 属性
也可以通过Python的内置方法来添加和获取属性,如下所示:
print(getattr(emp, 'name')) # 获取属性
print(hasattr(emp, 'age')) # 是否包含属性
setattr(emp, 'age', 18) # 设置属性和值
print(hasattr(emp, 'age')) # 是否包含属性
print(getattr(emp, 'age')) # 获取属性
delattr(emp, 'age') # 删除属性
print(hasattr(emp, 'age')) # 是否包含属性
Python也有内置类的一些属性,如下所示:
# 内置对象
print("Employee.__doc__:", Employee.__doc__)
print("Employee.__name__:", Employee.__name__)
print("Employee.__module__:", Employee.__module__)
print("Employee.__bases__:", Employee.__bases__)
print("Employee.__dict__:", Employee.__dict__)
类的属性与方法
类的私有属性,以双下划线开头,只可以在类内部通过self进行访问。
类的protected属性,以下划线开头,只允许子类和自身调用。
在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数
类的私有方法:以两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methods
如下所示:
class JustCounter:
"""类描述"""
__secretCount = 0 # 类的私有变量
publicCount = 0 # 公开变量
def count(self):
self.__secretCount += 1
self.publicCount += 1
print('私有变量:', self.__secretCount)
Python不允许实例化的类访问私有数据,但你可以使用 object._className__attrName( 对象名._类名__私有属性名 )访问属性,如下所示:
print(counter._JustCounter__secretCount)
类的继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。
Python中的继承通过 class 子类名(父类名): 的格式实现。
子类可以调用父类的方法和定义自己的方法。
如果父类方法的功能不能满足需求,子类可以重写(overrides)父类的方法。
如下所示:Parent表示一个父类,拥有自己的属性和方法。
class Parent:
"""定义父类"""
parentAttr = 100
def __init__(self):
print('调用父类的构造函数')
def parentMethod(self):
print('调用父类方法')
def setAttr(self, attr):
Parent.parentAttr = attr
def getAttr(self):
print('父类属性:', Parent.parentAttr)
def myMethod(self):
print('我是父类的MyMethod')
Child表示一个子类,继承自Parent,如下所示:
class Child(Parent):
"""定义子类"""
def __init__(self):
print('调用子类的构造方法')
def childMethod(self):
print('调用子类方法')
def myMethod(self):
"""重写Overrides父类方法"""
print('我是子类的MyMethod')
def __str__(self):
"""重写方法,适合人阅读"""
return 'str方法返回'
子类的实例化
如下所示:
c = Child() # 实例化子类对象
c.childMethod() # 调用子类方法
c.parentMethod() # 调用父类方法
c.setAttr(200) # 再次调用父类方法,设置属性
c.getAttr() # 再次调用父类方法 获取属性
c.myMethod() # 调用的是子类的MyMethod
可以通过内置函数,判断子类与类的关系,如下所示:
print(issubclass(Child, Parent)) # 判断是否是对应的父子关系
print(isinstance(c, Child)) # 判断是否是实例对象
print(isinstance(c, Parent)) # 判断是否是实例对象
来源:https://www.cnblogs.com/hsiang/p/13069027.html
猜你喜欢
- 这个只是一个简单的比较无聊的尝试,类似blog等一些网站的换肤功能都是以此方式改变网站的皮肤。对于这些方法大家会的比较多,没啥说的。主要我是
- 今天在写PHP程序的时候总是出现这样的错误:Parse error: syntax error, unexpected end of fil
- 本文简单介绍了Python绘图库Matplotlib的安装,简介如下:matplotlib是python最著名的绘图库,它提供了一整套和ma
- 一般情况下x,y,z = 1,2,3print("x:",x)print("y:",y)print(
- 学习Django框架时,创建一个引擎及索引时报错,具体报错如下:执行命令:python3 manage.py rebuild_index报如
- 本文实例分析了python字典排序的方法。分享给大家供大家参考。具体如下:1、 准备知识:在python里,字典dictionary是内置的
- 最近发现一个问题,是关于IDEA的一些骚操作的事儿~具体怎么回事,一起来看看。我们都知道使用git分布式版本控制工具,提、拉 代码都会有一个
- 从人类认知的角度的看,人类擅长识别并不擅长于记忆,当一个用户面对浩瀚的信息海洋,通常会产生畏惧感,会本能的对这些信息片段进行加工找出其内在的
- mysqli对prepare的支持对于大访问量的网站是很有好处的,它极大地降低了系统开销,而且保证了创建查询的稳定性和安全性。prepare
- 由于Oracle自身比较复杂,在Linux环境下安装要涉及很多方面的因素。本文分两个方面介绍在Linux RedHat 6.0环境下Orac
- 在我们关于SQL服务器安全系列的这文章里,我们的目标是向你提供安全安装SQL服务器所需要的工具和信心,这样的话,你有价值的数据就会受到保护,
- 有的时候,一个 if … else … 还不够用。比如,根据年龄的划分:条件1:18岁或以上:adult条件2:6岁或以上:teenager
- <?php //设置我们将要使用的文件 $srcurl = "http://localhost/index.php"
- 前言python号称是编程界的万金油,那么是否可以做个读取电脑网卡wifi并暴力破解的小脚本呢?在这个基础上为了方便体验是不是可以将其打包成
- 本文实例讲述了php使用curl获取https请求的方法。分享给大家供大家参考。具体分析如下:今日在做一个项目,需要curl获取第三方的AP
- 感谢大家对《 CSS Sprites 样式生成工具 》的喜爱,综合了1.x版本时大家所提出来的意见和建议,2.0版本主要的改变有下面几点:修
- 适配器模式说明说明: 适配器模式,一般是为要使用的接口,不符本应用或本系统使用,而需引入的中间适配层类或对象的情况;场景: 就好比我们买了台
- 之前一篇文章里提到了利用Cython来编译Python,这次来讲一下如何用Cython给Python写扩展库。两种语言混合编程,其中最重要的
- 字符串是日常开发中用到最多的数据类型之一,了解字符串首先要明白定界符。定界符有4种,单引号、双引号、heredoc、nowdoc,常使用的单
- 本文实例讲述了Python基础之字符串常见操作。分享给大家供大家参考,具体如下:字符串基本操作切片# str[beg:end]# (下标从