Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解


Posted in Python onFebruary 28, 2019

本文实例讲述了Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法。分享给大家供大家参考,具体如下:

1. 定义类

python中定义一个类的格式如下:

class MyClass(object):
  def __init__(self,data1,data2):
    self.__data1=data1
    self.data2=data2
  def __func1(self):
    print("MyClass类的私有方法被调用!")
  def print_data(self):
    self.__func1()
    print(self.__data1)
    print(self.data2)
  def setData(self,data):
    self.__data1=data
class1=MyClass('first_data','sencond_data')
class1.print_data()
class1._MyClass__func1()

类通过关键字 class 引导,后跟类的名称,通常第一个字母大写,类名称MyClass后的括号内的object表示该类的父类,如果定义的类没有显明从哪个类继承来的,就在括号内使用object,object类是所有类的父类。

__init__是定义的类的构造函数,可以对类的变量进行初始化,每当该类被实例化的时候,就会先执行该构造函数。

在类中定义的函数的一个参数一定要是self,代表类当前的实例化对象,但在调用时,不需要传递这个参数。

2. 类的实例

类的实例化方法如下:

obj=MyClass(x,x)

obj是类的实例化对象,MyClass是类名,括号内的变量是类的初始化变量(如果类中有定义的话)。

情况一: 类的初始属性为空

class MyClass(object):
  def __init__(self):
    print("MyClass类的构造方法被调用!")
class1=MyClass()

情况二: 类含有初始属性

class MyClass(object):
  def __init__(self,data1,data2):
    self.__data1=data1
    self.data2=data2
class1=MyClass('first_data','sencond_data')
print(class1.data2)

3. 类的封装

封装、继承和多态是类的三大特征。类的封装有两层含义,一个是对数据的封装,一个是对实现逻辑即方法的封装。

数据(属性)的封装

还看上一个例子:

class MyClass(object):
  def __init__(self,data1,data2):
    self.__data1=data1
    self.data2=data2
class1=MyClass('first_data','sencond_data')
print(class1.data2)

在这里类MyClass的实例化对象class1就具有了两个属性,分别是data1和data2,data1是私有属性,只能在类内使用,data2是公有属性,可以在类外使用。data1和data2就是对数据(属性)的封装。

实现逻辑(方法)的封装

class MyClass(object):
  def __init__(self,data1,data2):
    self.__data1=data1
    self.data2=data2
  def printMax(self):
    if self.__data1>self.data2:
      print(self.__data1)
    else:
      print(self.data2)
class1=MyClass(66,88)
class1.printMax()

上边类中的printMax函数实现了比较两个数据大小并打印的功能,这个实现逻辑在类外部来说是看不到的,只可以调用该接口,相当于一个黑箱子,这就是实现逻辑(方法)的封装。

4. 类的私有属性

可以在类内定义类的私有属性和方法,私有的表明只属于类内部的,在类外部是不可以直接访问的,python定义私有属性和私有方法的方法是在名称前加上两个下划线 “__”。

私有属性(变量)

class MyClass(object):
  def __init__(self,data1,data2):
    self.__data1=data1
    self.data2=data2
class1=MyClass(66,88)
print(class1.data2)
print(class1.__data1)

上例中data2是公有变量,可以在类外访问,所有calss1.data2没有问题。 data1是类的私有属性,类外不可以访问,使用 class1.__data1会报错 'MyClass' object has no attribute '__data1'

私有方法

class MyClass(object):
  def __init__(self,data1,data2):
    self.__data1=data1
    self.data2=data2
  def __func1(self):
    print("MyClass类的私有方法被调用!")
  def print_data(self):
    self.__func1()
    print(self.__data1)
    print(self.data2)
class1=MyClass(66,88)
class1.print_data()
#class1.__func1()

上例中 print_data方法是类的公有方法,可以在类外直接调用, __func1方法是类的私有方法,不可以在类外调用,但是可以通过类内的print_data方法调用私有的__func1方法,即私有的方法可以在类的内部被调用。

5. 类外访问类的私有属性

类的私有属性保证了外部代码不能随意访问/更改对象内部的数据和方法。

但是对类内私有属性,在类外仍然可以通过以下两种 方式进行访问和修改,一是通过类内的公有函数修改,一是“非法修改”。

通过类内的公有函数修改

class MyClass(object):
  def __init__(self,data1,data2):
    self.__data1=data1
    self.data2=data2
  def setData1(self,data):
    self.__data1=data
  def printData1(self):
    print(self.__data1)
class1=MyClass(66,88)
class1.setData1(100)
class1.printData1()

非法修改

python中类的私有属性或方法之所以不能直接从类外部进行访问,是因为python解释器把私有的属性或方法 __xx 对外展示成了 _Class__xx,即单下划线+类名+__xx 。所以如果你执意,仍然可以在类外部通过这个改变后的名称“非法”访问私有属性。

class MyClass(object):
  def __init__(self,data1,data2):
    self.__data1=data1
    self.data2=data2
  def printData1(self):
    print(self.__data1)
class1=MyClass(66,88)
print(class1._MyClass__data1)

当然一般不建议这么干,不同的python编译器可能把私有属性/方法包装成不同的名字。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python实现脚本锁功能(同时只能执行一个脚本)
May 10 Python
tensorflow 获取变量&打印权值的实例讲解
Jun 14 Python
执行Django数据迁移时报 1091错误及解决方法
Oct 14 Python
python数据预处理 :数据共线性处理详解
Feb 24 Python
pyqt5数据库使用详细教程(打包解决方案)
Mar 25 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
python多线程semaphore实现线程数控制的示例
Aug 10 Python
pycharm激活方法到2099年(激活流程)
Sep 22 Python
python各种excel写入方式的速度对比
Nov 10 Python
Python3+Appium安装及Appium模拟微信登录方法详解
Feb 16 Python
基于PyInstaller各参数的含义说明
Mar 04 Python
Python自动化爬取天眼查数据的实现
Jun 15 Python
Python类的继承、多态及获取对象信息操作详解
Feb 28 #Python
django模板结构优化的方法
Feb 28 #Python
详解python做UI界面的方法
Feb 27 #Python
总结python中pass的作用
Feb 27 #Python
Python递归函数实例讲解
Feb 27 #Python
PyQt打开保存对话框的方法和使用详解
Feb 27 #Python
python中嵌套函数的实操步骤
Feb 27 #Python
You might like
php 文件上传代码(限制jpg文件)
2010/01/05 PHP
php分页思路以及在ZF中的使用
2012/05/30 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
List the Codec Files on a Computer
2007/06/18 Javascript
JS 继承实例分析
2008/11/04 Javascript
Jquery $.getJSON 在IE下的缓存问题解决方法
2014/10/10 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
JavaScript高仿支付宝倒计时页面及代码实现
2016/10/21 Javascript
拖动时防止选中
2017/02/03 Javascript
canvas 实现中国象棋
2017/02/17 Javascript
bootstrap PrintThis打印插件使用详解
2017/02/20 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
vue 项目常用加载器及配置详解
2018/01/22 Javascript
详解Chai.js断言库API中文文档
2018/01/31 Javascript
微信小程序数据分析之自定义分析的实现
2018/08/17 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
浅谈Python类里的__init__方法函数,Python类的构造函数
2016/12/10 Python
pandas series序列转化为星期几的实例
2018/04/11 Python
详解Python做一个名片管理系统
2019/03/14 Python
Python supervisor强大的进程管理工具的使用
2019/04/24 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
教师应聘自荐信范文
2014/03/14 职场文书
公司大门门卫岗位职责
2014/06/11 职场文书
企业委托书范本
2014/09/13 职场文书
新闻通讯稿模板
2015/07/22 职场文书
调解协议书范本
2016/03/21 职场文书
建筑工程挂靠协议书
2016/03/23 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
jQuery ajax - getScript() 方法和getJSON方法
2021/05/14 jQuery
浅谈mysql哪些情况会导致索引失效
2021/11/20 MySQL