浅析Python面向对象编程


Posted in Python onJuly 10, 2020

概述

很多人接触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)) # 判断是否是实例对象

以上就是浅析Python面向对象编程的详细内容,更多关于Python面向对象编程的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python OS模块常用函数说明
May 23 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
May 03 Python
Python中的is和==比较两个对象的两种方法
Sep 06 Python
Python Socket使用实例
Dec 18 Python
python解决pandas处理缺失值为空字符串的问题
Apr 08 Python
Python实现的批量修改文件后缀名操作示例
Dec 07 Python
Python元组常见操作示例
Feb 19 Python
Django页面数据的缓存与使用的具体方法
Apr 23 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
Aug 15 Python
Python利用matplotlib绘制折线图的新手教程
Nov 05 Python
Python答题卡识别并给出分数的实现代码
Jun 22 Python
python自动获取微信公众号最新文章的实现代码
Jul 15 Python
Python爬虫小例子——爬取51job发布的工作职位
Jul 10 #Python
Python 如何对文件目录操作
Jul 10 #Python
Python下划线5种含义代码实例解析
Jul 10 #Python
Python 没有main函数的原因
Jul 10 #Python
如何教少儿学习Python编程
Jul 10 #Python
Django def clean()函数对表单中的数据进行验证操作
Jul 09 #Python
django form和field具体方法和属性说明
Jul 09 #Python
You might like
纯php打造的tab选项卡效果代码(不用js)
2010/12/29 PHP
基于Zend的Config机制的应用分析
2013/05/02 PHP
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
jquery中获取元素的几种方式小结
2011/07/05 Javascript
window.navigate 与 window.location.href 的使用区别介绍
2013/09/21 Javascript
提高jQuery性能的十个诀窍
2013/11/14 Javascript
js实现宇宙星空背景效果的方法
2015/03/03 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
webpack打包单页面如何引用的js
2017/06/07 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
2020/01/22 Javascript
[01:21]辉夜杯战队访谈宣传片—CDEC
2015/12/25 DOTA
[40:17]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第一场
2018/04/06 DOTA
Python保存MongoDB上的文件到本地的方法
2016/03/16 Python
python数据结构链表之单向链表(实例讲解)
2017/07/25 Python
Python利用pandas计算多个CSV文件数据值的实例
2018/04/19 Python
快速解决pandas.read_csv()乱码的问题
2018/06/15 Python
使用Python自动化破解自定义字体混淆信息的方法实例
2019/02/13 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
django项目中使用手机号登录的实例代码
2019/08/15 Python
关于Numpy数据类型对象(dtype)使用详解
2019/11/27 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
儿科护士实习自我鉴定
2013/10/17 职场文书
货物运输服务质量承诺书
2014/05/29 职场文书
教师批评与自我批评心得体会
2014/10/16 职场文书
西柏坡导游词
2015/02/05 职场文书
关于幸福的感言
2015/08/03 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
nginx 反向代理之 proxy_pass的实现
2021/03/31 Servers