浅析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 相关文章推荐
在Lighttpd服务器中运行Django应用的方法
Jul 22 Python
Python的GUI框架PySide的安装配置教程
Feb 16 Python
Python中多线程的创建及基本调用方法
Jul 08 Python
Ubuntu下创建虚拟独立的Python环境全过程
Feb 10 Python
Python使用matplotlib绘制余弦的散点图示例
Mar 14 Python
Python带动态参数功能的sqlite工具类
May 26 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
Jul 13 Python
python编辑用户登入界面的实现代码
Jul 16 Python
Python3的介绍、安装和命令行的认识(推荐)
Oct 20 Python
Python基础之循环语句用法示例【for、while循环】
Mar 23 Python
Python 使用 prettytable 库打印表格美化输出功能
Dec 26 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 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的list()的一步操作给一组变量进行赋值的使用
2011/05/18 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
Yii2中简单的场景使用介绍
2017/06/02 PHP
php插入mysql数据返回id的方法
2018/05/31 PHP
PHP实现用session来实现记录用户登陆信息
2018/10/15 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
javascript 函数调用规则
2009/08/26 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
js关于命名空间的函数实例
2015/02/05 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
老生常谈JavaScript 正则表达式语法
2016/08/20 Javascript
基于jQuery ligerUI实现分页样式
2016/09/18 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
JavaScript体验异步更好的解决办法
2018/01/08 Javascript
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
js判断在哪个浏览器打开项目的方法
2020/01/21 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
2020/10/29 Javascript
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
利用Python自动监控网站并发送邮件告警的方法
2016/08/24 Python
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
python调用百度语音识别api
2018/08/30 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
2018/11/07 Python
Python2与Python3的区别实例分析
2019/04/11 Python
高级3D打印市场:Gambody
2019/12/26 全球购物
省级优秀毕业生主要事迹
2014/05/29 职场文书
群众路线自我剖析范文
2014/11/04 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
信用卡收入证明范本
2015/06/12 职场文书
我的收音机情缘
2022/04/05 无线电
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏
数据设计之权限的实现
2022/08/05 MySQL