Python基础学习之类与实例基本用法与注意事项详解


Posted in Python onJune 17, 2019

本文实例讲述了Python基础学习之类与实例基本用法与注意事项。分享给大家供大家参考,具体如下:

前言

和其他编程语言相比,Python用非常少的新语法和语义将类加入到语言中。Python的类提供了面向对象编程的所有标准特性:类继承机制允许多个基类,派生类可以覆盖它基类的任何方法,一个方法可以调用基类中相同名称的的方法。对象可以包含任意数量和类型的数据。和模块一样,类也拥有Python天然的动态特性:它们在运行时创建,可以在创建后修改。

Python的类

Python类实例时,先调用__new__方法,返回该类的实例对象,这个实例对象就是__init__方法的第一个参数self,即self是__new__的返回值

(1)类的访问控制:

①默认:Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量。

②私有:在python中定义私有变量只需要在变量名或函数名前加上”__“两个下划线,那么这个函数或变量就是私有的了

原理:在内部,python使用一种name mangling技术,将__membername替换成_classname__membername,也就是说,类的内部定义中,所有以双下划线开始的名字都被"翻译"成前面加上单下划线和类名的形式。

例如:为了保证不能在class之外访问私有变量,Python会在类的内部自动的把我们定义的__spam私有变量的名字替换成为_classname__spam(注意,classname前面是一个下划线,spam前是两个下划线),因此,用户在外部访问__spam的时候就会提示找不到相应的变量。

注:python中的私有变量和私有方法仍然是可以访问的;访问方法如下:

私有变量:实例._类名__变量名

私有方法:实例._类名__方法名()

(2)Python类和类成员的私有化支持:

其实,Python并没有真正的私有化支持,但可用下划线得到伪私有。所以一般需要统一规范:

① _xxx:"单下划线" 开始的成员变量叫做保护变量(protected),意思是只有类实例和子类实例能访问到这些变量

需通过类提供的接口进行访问;不能用'from <module> import *'导入;

② __xxx:类中的私有变量/方法名(Python的函数也是对象,所以成员方法称为成员变量也行得通),

" 双下划线 "开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据;

③ __xxx__系统定义名字,前后均有一个“双下划线”代表python里特殊方法专用的标识,如__init__()代表类的构造函数;

注:python派生类可以与父类同名,因此这种情况可以使用私有变量:

class A():
  def __init__(self):
    self.__name='python' #翻译成self._A__name='python'
class B(A):
  def func(self):
    print self.__name #翻译成print self._B__name
instance=B()
#instance.func()#报错:AttributeError: B instance has no attribute '_B__name'
print instance.__dict__
print instance._A__name

输出结果:

{'_A__name': 'python'}
python

注:当B类取名A时,则instance.func()可以直接调用

(3)Python类的继承:

python类和其他OOP语言一样,都可以使用继承功能,也同样不允许多继承,但可以通过多级继承来实现。

(1)继承方法:派生类的类名的()里面写入父类的类名;

(2)构造函数:子类中构造函数加上super(子类,self).__init__(参数1,参数2,….);

(3)实例化顺序:实例化对象c---->c调用子类__init__()---->子类__init__()继承父类__init__()----->调用父类__init__();

(4)判断继承的函数:isinstance()及issubclass(),其中isinstance()用于检查实例类型;issubclass()用于检查类继承;

(5)方法重写:子类中定义与父类同名的方法,子类实例调用时就会使用重写的方法;

(6)子类重写构造函数:子类构造函数中不使用super调用父类即可;

(7)多态:当子类和父类都存在相同名字的方法时,子类的方法覆盖了父类的方法,在代码运行时,会调用子类的方法;

注:多态实现了开发-封闭原则:

①对扩展开放(Open for extension):允许子类重写方法函数;
②对修改封闭(Closed for modification):不重写,直接继承父类方法函数;

Python类的其他知识

(1)python中self和cls的区别:

self表示一个具体的实例本身,相当于php的this。如果用了staticmethod,那么就可以无视这个self,将这个方法当成一个普通的函数使用;

cls表示这个类本身;

@staticmethod:只能用类名去调用的方法;
@classmethod:既能用实例去调用,也能用类名去调用的方法;

(2)多重继承的方法搜索顺序:

对于多数应用来说,在最简单的情况下,你可以认为搜索从父类所继承属性的操作是深度优先、从左至右的,当层次结构中存在重叠时不会在同一个类中搜索两次。 因此,如果某一属性在 DerivedClassName 中未找到,则会到 Base1 中搜索它,然后(递归地)到 Base1 的基类中搜索,如果在那里未找到,再到 Base2 中搜索,依此类推。

真实情况比这个更复杂一些;方法解析顺序会动态改变以支持对 super() 的协同调用。 这种方式在某些其他多重继承型语言中被称为后续方法调用,它比单继承型语言中的 super 调用更强大。

动态改变顺序是有必要的,因为所有多重继承的情况都会显示出一个或更多的菱形关联(即至少有一个父类可通过多条路径被最底层类所访问)。 例如,所有类都是继承自 object,因此任何多重继承的情况都提供了一条以上的路径可以通向 object。 为了确保基类不会被访问一次以上,动态算法会用一种特殊方式将搜索顺序线性化, 保留每个类所指定的从左至右的顺序,只调用每个父类一次,并且保持单调(即一个类可以被子类化而不影响其父类的优先顺序)。

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

Python 相关文章推荐
在Python的while循环中使用else以及循环嵌套的用法
Oct 14 Python
关于Python元祖,列表,字典,集合的比较
Jan 06 Python
Python中使用haystack实现django全文检索搜索引擎功能
Aug 26 Python
对pandas中apply函数的用法详解
Apr 10 Python
详解通过API管理或定制开发ECS实例
Sep 30 Python
python 使用sys.stdin和fileinput读入标准输入的方法
Oct 17 Python
python实现一行输入多个值和一行输出多个值的例子
Jul 16 Python
如何使用selenium和requests组合实现登录页面
Feb 03 Python
利用python中的matplotlib打印混淆矩阵实例
Jun 16 Python
Python numpy矩阵处理运算工具用法汇总
Jul 13 Python
Python爬虫实现selenium处理iframe作用域问题
Jan 27 Python
Python爬虫之爬取某文库文档数据
Apr 21 Python
python文本数据处理学习笔记详解
Jun 17 #Python
python3+PyQt5 实现Rich文本的行编辑方法
Jun 17 #Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
Jun 17 #Python
python3+PyQt5 数据库编程--增删改实例
Jun 17 #Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 #Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
Jun 17 #Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
Jun 17 #Python
You might like
PHP安全技术之 实现php基本安全
2010/09/04 PHP
一个基于PDO的数据库操作类(新) 一个PDO事务实例
2011/07/03 PHP
php生成局部唯一识别码LUID的代码
2012/10/06 PHP
php使用fopen创建utf8编码文件的方法
2014/10/31 PHP
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
php 实现301重定向跳转实例代码
2016/07/18 PHP
laravel5实现微信第三方登录功能
2018/12/06 PHP
javascript中的undefined 与 null 的区别  补充篇
2010/03/17 Javascript
Jquery增加鼠标中间功能mousewheel的实例代码
2013/09/05 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
JS比较两个时间大小的简单示例代码
2013/12/20 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
JavaScript获取网页表单提交方式的方法
2015/04/02 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
JavaScript保留关键字汇总
2015/12/01 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
web页面和微信小程序页面实现瀑布流效果
2018/09/26 Javascript
laydate如何根据开始时间或者结束时间限制范围
2018/11/15 Javascript
通过说明与示例了解js五种设计模式
2019/06/17 Javascript
Python标准库之循环器(itertools)介绍
2014/11/25 Python
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
浅谈django中的认证与登录
2016/10/31 Python
解决Tensorflow 内存泄露问题
2020/02/05 Python
python中str内置函数用法总结
2020/12/27 Python
matplotlib交互式数据光标mpldatacursor的实现
2021/02/03 Python
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
计算 s=(x*y)1/2,用两个宏定义来实现
2016/08/11 面试题
大学学生会竞选演讲稿
2014/04/25 职场文书
预备党员公开承诺书
2014/05/28 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
地震慰问信
2015/02/14 职场文书
物业保安辞职信
2015/05/12 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书
PyQt5爬取12306车票信息程序的实现
2021/05/14 Python
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
2022/06/25 Servers