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

作者:-牧野- 时间:2021-10-15 16:14:07 

本文实例讲述了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程序设计有所帮助。

来源:https://blog.csdn.net/dcrmg/article/details/75041125

标签:Python,类,实例化,封装
0
投稿

猜你喜欢

  • 浅谈MySQL 亿级数据分页的优化

    2024-01-23 18:09:57
  • 在Python 3中实现类型检查器的简单方法

    2022-08-13 13:30:30
  • python如何运行js语句

    2022-04-10 02:34:27
  • python GUI计算器的实现

    2021-11-30 01:00:53
  • 如何使用python爬取知乎热榜Top50数据

    2021-11-13 05:47:09
  • Oracle 9i产品文档

    2010-07-16 13:35:00
  • mysql提示[Warning] Invalid (old?) table or database name问题的解决方法

    2024-01-14 18:18:54
  • python中pass语句用法实例分析

    2021-08-12 01:49:13
  • 基于Python编写一个刷题练习系统

    2022-10-01 13:28:34
  • ASP如何获取通过代理的真实IP地址

    2007-09-20 13:11:00
  • Vue状态管理库Pinia详细介绍

    2024-05-09 15:11:43
  • easy_install python包安装管理工具介绍

    2022-01-01 14:06:59
  • 如何计算多个订单的核销金额

    2024-01-26 17:56:31
  • php逐行读取txt文件写入数组的方法 <font color=red>原创</font>

    2023-11-14 17:22:07
  • python多进程下的生产者和消费者模型

    2022-05-30 02:37:07
  • 10分钟教你用Python实现微信自动回复功能

    2021-03-14 04:04:47
  • python如何利用matplotlib绘制并列双柱状图并标注数值

    2022-08-06 22:00:33
  • 关于点击区域

    2009-07-24 13:08:00
  • line-height 属性的继承问题

    2008-07-26 12:27:00
  • 利用Python实现自动生成数据日报

    2022-08-26 11:12:48
  • asp之家 网络编程 m.aspxhome.com