侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   166

本文实例讲述了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__nameinstance=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数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

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


  • 上一条:
    python批量下载抖音视频
    下一条:
    python文本数据处理学习笔记详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客