python学习之路基础篇(第八篇)

一、作业(对象的封装)          
  要点分析
1.封装,对象中嵌套对象
2.pickle,load,切记,一定要先导入相关的类
二、上节内容回顾和补充     
面向对象基本知识:
1.类和对象的关系
2.三大特性:
封装
继承
面向对象的三大特性:多态的补充
多态(多种形态,多种类型)
python的多态
def func(arg):print(arg)func(1)
func('lili')
func([11,22,33])

JAVA/C++的多态

#用python语言的格式来写JAVA/C++语言的多态
def func(int arg):print(arg)func(123)
func('hangzheng')  #此种写法在java和c++会报错,原因在于,上面已经明确定义arg的类型是int#JAVA/C++语言中多态的表现形式
class A:pass
class B(A):pass
class C(A):pass#arg参数:必须要是A类型或A的子类型
def func(A arg):print(arg)#obj = B()
#obj = C()
obj = A()
func(obj)
三、面向对象 类成员
    1.字段  
普通字段 属于对象,由对象来进行调用
#普通字段
class  Province:def __init__(self,name):self.name = nameself.country = "中国"def show(self):print(self.name)hlj = Province("黑龙江")
sd = Province('山东')
print(hlj.name)
print(sd.name)
#其中:name country都是普通字段
#此程序的缺点:每次打印的时候都会打印出“中国”,在内存中就会保存多份相同的country字段"中国"
疑问:在保证省份正常输出的情况下,能不能使其就保存一份呢?解决此问题的方法:静态字段
 静态字段 属于类,由类来进行调用
 
#静态字段在内存中只保存一份,普通方法则需要在内存中保存多份
class Province:#静态字段,保存在类中country = "中国"def __init__(self,name):#动态字段,保存在对象中self.name = namehn = Province("河南")
hb = Province("河北")
#一般情况下,自己访问自己的字段
#规则:普通字段只能用对象访问
#静态字段用类访问(万不得已的时候可以使用对象访问)
print(hn.name)
print(Province.country)
print(hb.country)#说明
#country保存在类中,内存中有country
#类一旦被加载,静态字段就有值
#静态字段在代码加载时,已经创建
       
2.方法
所有的方法属于类
1.普通方法:至少一个self,由对象调用执行
2.静态方法:任意参数, 由类调用执行(对象执行)
3.类方法: 至少一个cls, 由类调用执行(对象执行)
#普通方法  静态方法  类方法
class Province:#静态字段,属于类,由类进行调用country = "中国"def __init__(self,name):#普通字段,属于对象,由对象调用self.name = name#普通方法:由对象调用执行(方法属于类)def show(self):print(123)@staticmethoddef f1(cla,arg1,arg2):#静态方法,由类来进行调用,不需要创建对象即可进行调用#参数可无,也可以是多个#当方法内部不需要对象中封装的值时,可以将方法写成静态方法print(arg1,arg2)

  


3.属性
不伦不类的东西
具有方法的写作形式,具有字段的访问形式
#属性:让方法以字段的方式去访问
class Pager:def __init__(self,all_count):self.all_count = all_count@propertydef all_pager(self):a1,a2 = divmod(self.all_count,10)if a2 == 0:return a1else:return a1 + 1@all_pager.setterdef all_pager(self,value):print(value)@all_pager.deleterdef all_pager(self):print('del all_pager')p = Pager(101)
#p.all_count  #字段
#result = p.all_pager()   #方法
#print(result)#属性相关操作
#以字段方式去调用方法
ret = p.all_pager  #调用方法即执行@property
print(ret)
p.all_pager = 123   #给字段重新赋值,执行此操作时即执行@all_pager.setter方法
ret = p.all_pager
print(ret)
del p.all_pager   #删除字段,执行此操作时即执行@all_pager.deleter方法

属性的第二种表现形式:

class Pager:def __init__(self,all_count):self.all_count = all_countdef f1(self):return 123def f2(self,value):passdef f3(self):passfoo = property(fget=f1,fset=f2,fdel=f3)p = Pager(101)
result = p.foo
print(result)p.foo = 'alex'del p.foo

说明:当执行p.foo时,会执行fget=f1,也即会执行第一个函数f1,

        当执行p.foo='alex'时,会执行fget=f2,也即会执行第二个函数f2

    当执行del p.foo时,会执行fget=f3,也即会执行第三个函数f3

四、成员修饰符
成员:字段 方法 属性
共有:内外部都可以进行访问
私有:只能类自己本身成员内部可以访问
注意:不到万不得已不要在外部强制访问私有成员 对象._类名__name
class Foo:# 静态字段__cc = "123"def __init__(self, name):# 普通字段,私有成员self.__name = namedef f1(self):print(self.__name)@staticmethoddef f3():print(Foo.__cc)print(Foo.__cc)
#obj = Foo('hello')
#print(obj.__name)
#obj.f1()
# obj.f3()
#Foo.f3()

执行结果如下:

C:\python35\python3.exe D:/PythonS13/Day8/homework/blog.py
Traceback (most recent call last):File "D:/PythonS13/Day8/homework/blog.py", line 20, in <module>print(Foo.__cc)
AttributeError: type object 'Foo' has no attribute '__cc'

说明:报错信息中提示:AttributeError: type object 'Foo' has no attribute '__cc',而实际上__cc是存在的,那为什么还会报错呢?大家注意看静态字段cc前面多了两个下划线(__),由于字段前面有了两个下划线,此时静态字段已经变为了静态私有字段,既然是私有的,在外部当然不可以别调用了。所以在外部调用私有字段时就会报错。

#普通方法
class Foo:#静态字段__cc = "123"def __init__(self,name):#私有字段self.name = namedef __f1(self):print(self.name)def f2(self):passdef f3(self):self.__f1()@staticmethoddef f4():print(Foo.__cc)#print(Foo.__cc)  报错
obj = Foo('hello')
obj.f3()
Foo.f4()obj = Foo('alex')
#obj.__f1()  报错
#静态方法
class Foo:#静态字段__cc = "123"def __init__(self,name):#私有字段self.name = namedef f1(self):print(self.name)@staticmethoddef __f2():print(Foo.__cc)@staticmethoddef f3():Foo.__f2()obj = Foo('alex')
obj.f1()
#Foo.__f2()  #调用私有静态方法会报错
Foo.f3()
#类方法
class Foo:#静态字段__cc = "123"def __init__(self,name):#私有字段self.name = namedef f1(self):print(self.name)@staticmethoddef __f2():print(Foo.__cc)@staticmethoddef f3():Foo.__f2()@classmethoddef f4(cls):Foo.__f5()@classmethoddef __f5(cls):print(cls)#Foo.__f5()  调用私有类方法会报错
Foo.f4()
五、特殊成员
1.__init__
 __init__:构造函数,通过类创建对象时,自动触发执行
class Foo:def __init__(self, name):self.name = nameself.age = 18obj = Foo('mohan') # 自动执行类中的 __init__ 方法
2.__module__和__class__
__module__:表示当前操作的对象在哪个模块
__class__:表示当前操作的对象的类是什么
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#__module__和__class__#lib/demo
class C:def __init__(self):self.name = 'zhangsan'#index.py
from lib.demo import Cobj = C()
print(obj.__module__) # 输出 lib.aa,即:输出模块
print(obj.__class__)      # 输出 lib.aa.C,即:输出类#程序执行结果
lib.demo
<class 'lib.demo.C'> 
4.__del__
__del__:析构方法,当对象在内存中被释放时,自动触发执行
注:此方法一般无需定义,因为python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的
class Foo:def __del__(self):print("我马上要消失了")
5.__call__
对象后面加括号,触发执行
注:构造方法的执行是由创建对象触发的,即:对象 = 类名();而对于__call__方法的执行是由对象后面加括号触发的,即:对象()或者是类()
class Foo:def __init__(self):passdef __call__(self, *args, **kwargs):print '__call__'obj = Foo() # 执行 __init__
obj()       # 执行 __call__
6.__doc__:类的描述信息
class Foo:""" 描述类信息,定义一个函数 """def func(self):passprint(Foo.__doc__)
#输出:类的描述信息
7.__dict__
类或对象中的所有成员
普通字段属于对象,类中的静态字段和方法属于类
class Province:country = '中国'def __init__(self, name, count):self.name = nameself.count = countdef func(self, *args, **kwargs):print 'func'# 获取类的成员,即:静态字段、方法、
print(Province.__dict__)
# 输出:{'country': '中国', '__module__': '__main__', 'func': <function func at 0x10be30f50>, '__init__': <function __init__ at 0x10be30ed8>, '__doc__': None}obj1 = Province('河南',100000)
print(obj1.__dict__)
# 获取 对象obj1 的成员
# 输出:{'count': 100000, 'name': '河南'}obj2 = Province('山东', 4888)
print(obj2.__dict__)
# 获取 对象obj1 的成员
# 输出:{'count': 4888, 'name': '山东'}

7.__str__

如果一个类中定了__str__方法,那么在打印对象是,默认输出该方法的返回值

class Foo:def __str__(self):return 'mohan'obj = Foo()
print(obj)
# 输出:mohan

8.__getitem__ 、__setitem__、__delitem__

用于索引操作,如字典。以上分别表示获取、设置、删除数据

#!/usr/bin/env python
class Foo(object):def __getitem__(self, key):print( '__getitem__',key)def __setitem__(self, key, value):print('__setitem__',key,value)def __delitem__(self, key):print( '__delitem__',key)obj = Foo()result = obj['k1'] # 自动触发执行 __getitem__ obj['k2'] = 'mohan' # 自动触发执行 __setitem__ del obj['k1'] # 自动触发执行 __delitem__

9.__getslice__、__setslice__、__delslice__

 这三个方法用于分片操作,如:列表

#!/usr/bin/env pythonclass Foo(object):def __getslice__(self, i, j):print( '__getslice__',i,j)def __setslice__(self, i, j, sequence):print( '__setslice__',i,j)def __delslice__(self, i, j):print( '__delslice__',i,j)obj = Foo()obj[-1:1]                   # 自动触发执行 __getslice__
obj[0:1] = [11,22,33,44]    # 自动触发执行 __setslice__
del obj[0:2]                # 自动触发执行 __delslice__

10.__iter__

用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了__iter__

class Foo(object):passobj = Foo()for i in obj:print(i)# 报错:TypeError: 'Foo' object is not iterable
class Foo(object):def __iter__(self):passobj = Foo()for i in obj:print(i)# 报错:TypeError: iter() returned non-iterator of type 'NoneType'
#!/usr/bin/env python
# -*- coding:utf-8 -*-class Foo(object):def __init__(self, sq):self.sq = sqdef __iter__(self):return iter(self.sq)obj = Foo([11,22,33,44])for i in obj:print(i)

从以上步骤可以看出 ,for循环迭代的其实是iter([11,22,3,44]),所以执行流程可以变更为:

obj = iter([11,22,33,44])
for i in obj:print(i)

for循环内部语法结构;

obj = iter([11,22,33,44])while True:val = obj.next()print(val)

10.__new__和__metaclass__

请阅读以下代码:

class Foo(object):def __init__(self):passobj = Foo()   # obj是通过Foo类实例化的对象

上述代码中,obj是通过FOO类实例化的对象,其实,不仅obj是一个对象,FOO类本身也是一个对象,因为python中一切事物都是对象。

如果按照一切都是对象的理论:obj对象是通过FOO类的构造方法创建,那么FOO类对象应该也是通过执行某个类的构造方法创建的。

print(type(obj)) # 输出:<class '__main__.Foo'>     表示,obj 对象由Foo类创建
print(type(Foo)) # 输出:<type 'type'>              表示,Foo类对象由 type 类创建

所以,obj对象是Foo类的一个实例Foo类对象是 type 类的一个实例,即:Foo类对象 是通过type类的构造方法创建。

创建类的两种方式:

1.普通方式

class Foo(object):def func(self):print('hello mohan')  

2.特殊方式(type类的构造函数)

def func(self):print('hello mohan')Foo = type('Foo',(object,), {'func': func})
#type第一个参数:类名
#type第二个参数:当前类的基类
#type第三个参数:类的成员

类默认是由type类实例化产生,type类中如何实现的创建类,类又是如何创建对象?

答:类中有一个属性__metaclass__,其用来表示类是由谁来实例化创建,所以,我们可以为__metaclass__设置一个type类的派生类,从而查看类创建的过程。

class MyType(type):def __init__(self, what, bases=None, dict=None):super(MyType, self).__init__(what, bases, dict)def __call__(self, *args, **kwargs):obj = self.__new__(self, *args, **kwargs)self.__init__(obj)class Foo(object):__metaclass__ = MyTypedef __init__(self, name):self.name = namedef __new__(cls, *args, **kwargs):return object.__new__(cls, *args, **kwargs)# 第一阶段:解释器从上到下执行代码创建Foo类
# 第二阶段:通过Foo类创建obj对象
obj = Foo()

其他相关  

一、isinstance(obj,cls)

检查obj是否是类cls的对象

class Foo(object):passobj = Foo()isinstance(obj, Foo)

二、issubclass(sub,super)

检查sub类是否是super类的派生类

class Foo(object):passclass Bar(Foo):passissubclass(Bar, Foo)
六、设计模式之单例模式
七、面向对象其他
  -isinstance
  _issubclass
  _应用:
    1.自定义类型,对字典进行补充,有序字典
    2.对源码的扩展

八、异常处理
1、异常基础
在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是显示一个事先定义好的提示的页面,通俗来说就是不让用户看见大黄页!!!
try:pass
except Exception,ex:pass  
需求:求和
while True:num1 = input('num1:')num2 = input('num2:')try:num1 = int(num1)num2 = int(num2)result = num1 + num2except Exception, e:print '出现异常,信息如下:'print e

2、异常种类

python中的异常种类非常多,每个异常专门处理 某一项异常。

常见异常:

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

更多异常

ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

实例

#IndexErrordic = ["mohan", 'yamei']
try:dic[10]
except IndexError, e:print(e)#KeyError
dic = {'k1':'v1'}
try:dic['k20']
except KeyError, e:print(e)#ValueError
s1 = 'hello'
try:int(s1)
except ValueError, e:print(e)

对于上述实例,异常类只能处理指定的异常情况,如果非指定异常则无法处理

# 未捕获到异常,程序直接报错s1 = 'hello'
try:int(s1)
except IndexError,e:print(e)

所以,写程序时需要考虑到try代码块中可能出现的任意异常,可以这样写:

s1 = 'hello'
try:int(s1)
except IndexError,e:print(e)
except KeyError,e:print(e)
except ValueError,e:print(e)

万能异常:在python的异常中,Exception,它可以捕获任意异常

s1 = 'hello'
try:int(s1)
except Exception,e:print(e)

既然这样,python中的其他异常是不是就可以忽略了?

当然不是,对于特殊处理或提醒的异常需要先定义,最后定义Exception来确保程序的执行

s1 = 'hello'
try:int(s1)
except KeyError,e:print('键错误')
except IndexError,e:print('索引错误')
except Exception, e:print('错误')

3、异常其他结构

try:# 主代码块pass
except KeyError,e:# 异常时,执行该块pass
else:# 主代码块执行完,执行该块pass
finally:# 无论异常与否,最终执行该块pass

4、主动触发异常 

try:raise Exception('错误了。。。')
except Exception,e:print(e)

5、自定义异常

class MohanException(Exception):def __init__(self, msg):self.message = msgdef __str__(self):return self.messagetry:raise  MohanException('我的异常')
except  MohanException,e:print(e)

  

 

  

 

 

 

 


参考:http://www.cnblogs.com/wupeiqi/articles/5017742.html
   http://www.cnblogs.com/wupeiqi/p/4766801.html

转载于:https://www.cnblogs.com/yamei/p/5617770.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu实现树莓派交叉编译

一、交叉编译 在一个平台上生成另一个平台上的可执行代码。为什么要大费周折的进行交叉编译呢&#xff1f;一句话&#xff1a;不得已而为之。有时是因为目的平台上不允许或不能够安装所需要的编译器&#xff0c;而又需要这个编译器的某些特征&#xff1b;有时是因为目的平台上的…

ubuntu系统安装vscode教程

方法一&#xff1a; 依次输入如下命令 1、sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make 2、sudo apt-get update 3、sudo apt-get install ubuntu-make 4、umake ide visual-studio-code 提示输入a即可 方法二&#xff1a; 在windows系统下载安装包&#xff0c…

Vue2 源码漫游(一)

Vue2 源码漫游&#xff08;一&#xff09; 描述&#xff1a; Vue框架中的基本原理可能大家都基本了解了&#xff0c;但是还没有漫游一下源码。 所以&#xff0c;觉得还是有必要跑一下。 由于是代码漫游&#xff0c;所以大部分为关键性代码&#xff0c;以主线路和主要分支的代码…

神经网络中的反向传播算法

神经网络中的方向传播算法讲得复杂难懂。简单地说明它的原理&#xff1a; 神经网络&#xff1a;输入层&#xff0c;隐藏层&#xff0c;输出层。根据线性关系&#xff0c;激活函数&#xff0c;并最终根据监督学习写出误差表达式。此时&#xff0c;误差函数可写成&#xff0c;那么…

有限元笔记02:第三章

1.局部坐标到全局坐标变换 2.

Android 抽屉布局

目前部分APP使用一种类似抽屉式的布局&#xff0c;像QQ那种&#xff0c;感觉很炫&#xff0c;自己也一直想做一个像那样的布局&#xff0c;&#xff08;ps网上很多这样的例子&#xff0c;我下面做的就是参考网上的改变的&#xff09; 废话不就不说了&#xff0c;直接上代码 1、…

双目标定算法

坐标系基础知识&#xff1a; > 1.1. 从像素坐标系(u,v) 到 世界坐标系(Xw,Yw,Yw) 这里直接拿上篇博文的结果&#xff0c;中间省去了其它坐标系直接的关系&#xff0c;直接给出&#xff0c;如下所示&#xff1a; 公式如下&#xff1a; > 1.2. 符号规定( Notation ) 为了…

Excel使用控件创建动态地图图表

[本文软件Excel 2010] 效果图&#xff1a; 首先我们看一下数据源 数据源中第二列是对应图形的名称。首先创建图形&#xff0c;我们可能在网络中找到各个地图的矢量图形。不过不是每个地图图形都适合我们&#xff0c;或许企业划分非按照行政区划分。因此可以尝试自己绘制&#x…

使用Configuration Manager部署及管理软件更新(2)

承接上一篇文章&#xff1a;http://ericxuting.blog.51cto.com/8995534/1543835 一、 确定软件更新符合性 1. 打开Configuration Manager管理控制台&#xff0c;点击软件库&#xff0c;展开软件更新&#xff0c;点击所有软件更新 2. 点击主页中的运行摘要&#xff0c;等待对话框…

Fiddler 域名过滤

原来一直没意识到Fiddler过滤&#xff0c;导致每次抓包都要自己判断、搜索好多东西&#xff0c;真是呵呵&#xff01; 过滤设置很简单&#xff0c;看懂一张图就解决问题了。 箭头 那两处设置下&#xff0c;圆圈处保存再进行抓包即可 转载于:https://www.cnblogs.com/eejron/p/4…

windows中VS卸载opencv配置,重新安装其他版本

1、找到工程的属性管理器&#xff0c;电机Debug64和Release64下面的 包含目录和库目录&#xff0c;删掉其原由配置的oepncv路径&#xff1b; 找到链接器中的附加依赖项&#xff0c;删掉原有的配置&#xff1b;

学习笔记(36):Python网络编程并发编程-IO模型介绍

立即学习:https://edu.csdn.net/course/play/24458/296460?utm_sourceblogtoedu I/O模型介绍&#xff1a;I/O模型表示处于等待状态的模型&#xff0c;如套接字通讯的accept和recv函数一样 1.同步I/O 2.异步I/O 3.阻塞I/O 4.非阻塞I/O

AD9 如何画4层pcb板

新建的PCB文件默认的是2层板&#xff0c;教你怎么设置4层甚至更多层板。在工具栏点击Design-->Layer Stack Manager.进入之后显示的是两层板&#xff0c;添加为4层板&#xff0c;一般是先点top layer, 再点Add Layer,再点Add Layer&#xff0c;这样就成了4层板。见下图。 有…

windows上使用cmake 编译yaml-cpp源码,生成yam-cpp.lib

1、打开cmake-gui 2、添加CmakeList 3、建立build 4、进入工程中生成debug和release版本的lib

BZOJ 3039: 玉蟾宫( 悬线法 )

最大子矩阵...悬线法..时间复杂度O(nm)悬线法就是记录一个H向上延伸的最大长度(悬线), L, R向左向右延伸的最大长度, 然后通过递推来得到. ------------------------------------------------------------------#include<bits/stdc.h>using namespace std;#define ok(c) …

学习笔记(37):Python实战编程-yield实现生成器

立即学习:https://edu.csdn.net/course/play/19711/255579?utm_sourceblogtoedu1.yield return generator yield是一个返回的是一个生成器对象&#xff0c;是通过next函数一次一次地进行函数地迭代来获取结果的&#xff0c;而return函数则是将结果返回后&#xff0c;不再与…

Mocha BSM产品亮点——关联事件分析

业务需求与挑战企业经常会遇到下列场景&#xff1a;• 企业某应用&#xff0c;例如&#xff0c;WebSphere Portal Server&#xff0c;已经不可用&#xff0c;是由于应用自身已不可用&#xff1f;还是应用所连接的数据库出了问题&#xff1f;还是应用的LDAP服务不可用&#xff1…

学习笔记(38):Python实战编程-窗体显示

立即学习:https://edu.csdn.net/course/play/19711/343100?utm_sourceblogtoedu GUI&#xff1a;图形用户接口——GUI组件&#xff0c;组件定义&#xff0c;组件布局管理 主体窗口的设置&#xff1a; import tkinter#导入创建窗体的相关模块class Mainwindow():#创建窗口类de…

Tomcat 配置和spring-framework MVC配置简介

Tomcat启动时&#xff0c;先找系统变量CATALINA_BASE&#xff0c;如果没有&#xff0c;则找CATALINA_HOME。然后找这个变量所指的目录下的conf文件夹&#xff0c;从中读取配置文件。最重要的配置文件&#xff1a;server.xml 。要配置tomcat&#xff0c;基本上了解server.xml&am…

ultra edit ftp帐号管理导入导出方法

在更换电脑或ultra edit新安装时往往需要将原来使用的ftp帐号导入过来&#xff0c;可以在高级-备份/恢复用户定制-选中其他保存备份&#xff0c;拷贝出来然后再导入。 也可以在配置-ftp/sftp中保存&#xff0c;拷贝出来然后在安装好后配置。 步骤1. 导出ftp帐号信息&#xff1a…