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学习笔记 下载
Feb 10 Python
Python使用urllib2获取网络资源实例讲解
Dec 02 Python
django 自定义用户user模型的三种方法
Nov 18 Python
浅谈Python中数据解析
May 05 Python
python脚本设置系统时间的两种方法
Feb 21 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
Jul 12 Python
Python实现查找数组中任意第k大的数字算法示例
Jan 23 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
May 07 Python
Pycharm新手教程(只需要看这篇就够了)
Jun 18 Python
Python timeit模块的使用实践
Jan 13 Python
pycharm 配置svn的图文教程(手把手教你)
Jan 15 Python
Python如何加载模型并查看网络
Jul 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
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
php curl选项列表(超详细)
2013/07/01 PHP
php修改NetBeans默认字体的大小
2013/07/02 PHP
用js生产批量批处理执行命令
2008/07/28 Javascript
Jquery Ajax请求代码(2)
2011/01/07 Javascript
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
jquery 获取标签名(tagName)示例代码
2013/07/11 Javascript
jquery新的绑定事件机制on方法的使用方法
2014/04/15 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
Javascript中的作用域和上下文深入理解
2015/07/03 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
Vue.js实战之组件之间的数据传递
2017/04/01 Javascript
js与jquery获取input输入框中的值实例讲解
2020/02/27 jQuery
JavaScript实现矩形块大小任意缩放
2020/08/25 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
Python实现朴素贝叶斯分类器的方法详解
2018/07/04 Python
零基础使用Python读写处理Excel表格的方法
2019/05/02 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
Python中断多重循环的几种方式详解
2020/02/10 Python
python识别验证码图片实例详解
2020/02/17 Python
Django 删除upload_to文件的步骤
2020/03/30 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
2020/04/26 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
详解Pytorch显存动态分配规律探索
2020/11/17 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
CAT鞋美国官网:CAT Footwear
2017/11/27 全球购物
乌克兰机票、铁路和巴士票、酒店搜索、保险:Tickets.ua
2020/01/11 全球购物
大学生毕业自我鉴定
2013/11/06 职场文书
《北大荒的秋天》教学反思
2014/04/14 职场文书
公司庆典主持词
2015/07/04 职场文书
乡镇司法所2015年度工作总结
2015/10/14 职场文书