Python学习:16.Python面对对象(三、反射,构造方法,静态字段,静态方法)
一、构造方法
在使用类创建对象的时候(就是类后面加括号)就自动执行__init__方法。
class A:def __init__(self):print('A')class B:def __init__(self):print('B')obj = A()#虽然只是创建了obj对象,但是执行了__init__方法,输出了A
Python中派生类可以继承父类的构造方法
1.基于super()
遇到super()就表示去执行父类的xxx属性
class A:def __init__(self):print('A')self.tp = 'annimal'class B(A):def __init__(self):print('B')super(B,self).__init__()#执行B父类中的__init__方法,这里的self是obj #super里的self不是传入后面的__init__方法里,而是直接传入A中的__init__,这里super会帮你传递参数 obj = B()输出结果: B A
2.通过父类的名称执行父类的构造方法。
class A:def __init__(self):print('A')self.tp = 'annimal'class B(A):def __init__(self):print('B')A.__init__(self)#父类的名称跟上__init__() obj = B() 输出结果: B A
这两种方式中推荐super,使用第二中方法的时候,进行继承父类的方法的时候,是你指定父类的方法,看起来比较乱,但是使用super的时候,没有让你指定父类的名称,这种继承时候就按照正常的继承规则(上一节所讲)来进行。
二、反射
利用反射查看面向对象的成员
根据字符串的形式去对象(某个模块)操作其成员
class Foo:def __init__(self,name):self.name = namedef show(self):print('Fshow')r = hasattr(Foo,'show') print(r) #查看Foo类中是否有show函数 obj = Foo('alexsel') s = hasattr(obj,'name') print(s) #查看obj对象里name是否存在 t = hasattr(obj,'show') print(t) #通过对象查看是否存在show这个函数 输出结果: True True True
我们通过类进行查询的时候,仅仅只能找到类中的属性,但是我们通过类创建的对象查询的时候,我们不但可以找到对象中的属性(例如,self.name,直接在类中查询找不到),还可以找到对象中的方法(例如show函数),因为对象中有一个指向类的指针,当通过对象进行查询的时候,可以通过指针找到类中的属性。
利用反射导入模块、查找类、创建对象、查找对象中的字段
1.首先使用__import__导入文件
函数功能用于动态的导入模块,主要用于反射或者延迟加载模块。
__import__(module)相当于import module
2.使用getattr(所导入的文件名,类名)导入类
getattr根据字符串的形式去某个模块中寻找东西
3.通过找到的类创建对象
4.获取对象中的属性
s2.py文件中的代码
class Foo:def __init__(self,name):self.name = namedef show(self):print('Fshow')
s1.py文件中的代码
m = __import__('zp')class_name = getattr(m,'Foo')obj = class_name('Alexsel')val = getattr(obj,'name')print(val)输出结果: Alexsel
三、静态字段
静态字段的作用,将每个对象里存在的重复的东西,使用静态字段在类中只需写一份。
class Foo:annimal = 'Cat'#这个是静态字段,是在类中保存的def __init__(self,name):temp = 'Alexsel'#普通字段,存放在对象中#普通方法,存放在类中def show(self):print('SH')print(Foo.annimal)输出结果: Cat
使用静态字段的时候,优先使用类名访问静态字段。
四、静态方法
静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作。
class Foo:annimal = 'Cat'def __init__(self):passdef show(self):print('SH')#装饰器,使用这个装饰器装饰类中的一个方法,这个方法就变为静态方法 @staticmethoddef out():print('out')Foo.out() #静态方法中不需要传递self,所以访问静态方法优先使用类去访问 obj = Foo() obj.out()输出结果: out out
静态方法可以让我们不需要创建对象就可以执行类中的方法。
五、类方法
类方法是将类本身作为对象进行操作的方法。他和静态方法的区别在于:不管这个方式是从实例调用还是从类调用,它都用第一个参数把类传递过来。
class Foo:annimal = 'Cat'def __init__(self):passdef show(self):print('SH')#装饰器,使用这个装饰器装饰类中的一个方法,这个方法就变为类方法 @classmethoddef out(cls):print('out',cls)Foo.out() #类方法,会自动将的类传递到类方法的cls中 输出结果: out <class '__main__.Foo'>
转载于:https://www.cnblogs.com/liudi2017/p/9357613.html
Python学习:16.Python面对对象(三、反射,构造方法,静态字段,静态方法)相关推荐
- 《转》Python学习(16)-python异常
转自 http://www.cnblogs.com/BeginMan/p/3171445.html 一.什么是错误,什么是异常,它们两者区别 这里解释如下:个人觉得很通俗易懂 错误是指在执行代码过程中 ...
- 自动化测试之python基础什么是面对对象之类和对象
前言 学习自动化测试需要掌握一门开发语言,Java.python这两个可以选一个,这里呢笔者推荐的是python语言,因为它比较好学,那么今天呢,笔者就来给大家介绍一下python基础中的面对对象之类 ...
- Python学习之变量、对象和引用
Python学习之变量.对象和引用 文章目录 Python学习之变量.对象和引用 问题的引出 变量创建 变量类型 变量使用 动态类型 类型属于对象,而不是变量 对象的垃圾收集 参考资料 问题的引出 当 ...
- python学习笔记4(对象/引用;多范式; 上下文管理器)
python学习笔记4(对象/引用:多范式; 上下文管理器) ### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象 21. 动态类型:对象/引用 对象和引用: 对象是 ...
- python学习高级篇(part9)--对象的引用计数
学习笔记,仅供参考,有错必纠 文章目录 python 学习高级篇 类对象的特殊方法之`__str__()` 类对象的特殊方法之`__new__()` 对象的引用计数 什么是引用计数 对象的引用计数加1 ...
- 视频教程-爬虫微课5小时 Python学习路线-Python
爬虫微课5小时 Python学习路线 十多年的Java和大数据开发和培训,精通Hadoop.Spark和Android开发,对于数据分析和挖掘有比较深的研究.曾在公司独立开发O2O项目e小时.网店项目 ...
- Python 学习 02 —— Python如何爬取数据
文章目录 系列文章 二.Python 爬 虫 1.任务介绍 2.简介 3.基本流程 3.1.准备工作 3.1.1.分析页面 3.1.2.编码规范 3.1.3.导入模块 3.1.4.程序流程 3.2.获 ...
- python爬虫原理-python学习之python爬虫原理
原标题:python学习之python爬虫原理 今天我们要向大家详细解说python爬虫原理,什么是python爬虫,python爬虫工作的基本流程是什么等内容,希望对这正在进行python爬虫学习的 ...
- 菜菜的Python学习日记 | Python类实验代码分享
系列索引:菜菜的Python学习日记 | Python从入门到入土详解 Python类实验代码分享 编写程序,实现以下功能. (1)创建员工类Employee,属性有姓名name.能力值ability ...
- 深圳Python学习:Python几大问,你想知道的答案都在这里!-千锋
深圳Python学习:Python几大问,你想知道的答案都在这里!-千锋 人们为什么使用Python? 之所以选择Python的主要因素有以下几个方面: 软件质量:在很大程度上,Python更注重可读 ...
最新文章
- java i 原子_为什么i ++不是原子的?
- asp.net的几种简单连接数据库方法
- Tensorflow实例3: 验证码图片的识别训练,每张图片有4个字母
- oledb vc访问mdb数据库_SQL SERVER数据库技术-1
- 基于单链表的生产者消费者问题
- App热补丁动态修复技术介绍
- mysql 客户端_Linux桌面应用之MySQL客户端DBeaver
- Spring学习总结(5)——IOC注入方式总结
- 【特色团队采访】慌呀哩团队,用简洁算法达成高效协作
- 进阶~Qt程序启动画面
- 解决:Conversion to Dalvik format failed: Unable to execute dex: null
- iso 绝对pe_通用PE工具箱 V5.0(WIN7PE内核)U盘ISO硬盘完美三合一版
- (离散)设函数 f:A→B,g:B→C,证明:若g °f是满射,则g是满射.
- 前端三件套之css笔记
- 赵小楼《天道》《遥远的救世主》深度解析(81)一个不愿躺着对话的女人,应给与绝对尊严,这符合强势文化范畴
- css3中斜杠_使用斜杠语法设置CSS3边界半径
- 说说org.json.JSONObject功能和源码(二)
- 仓库管理系统软件哪个好
- Arcgis主页面字体太小
- CentOS 8 安装NVIDIA-Linux显卡驱动
热门文章
- 什么是区块链钱包?区块链钱包如何运作?
- 2018-08-01-weekly
- REST Framework 的用户认证组件
- java应用cpu使用率过高问题排查
- 手把手教你使用C#操作SQLite数据库,新建数据库,创建表,插入,查询,删除,运算符,like(持续更新)...
- 1021. Deepest Root (25)
- Java发邮件-QQ服务器认证
- jQuery的ajax()、post()方法提交数组,参数[] 问题
- Css3系列-新属性新布局
- 北大百年讲堂创新大会小游记