一、构造方法

在使用类创建对象的时候(就是类后面加括号)就自动执行__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面对对象(三、反射,构造方法,静态字段,静态方法)相关推荐

  1. 《转》Python学习(16)-python异常

    转自 http://www.cnblogs.com/BeginMan/p/3171445.html 一.什么是错误,什么是异常,它们两者区别 这里解释如下:个人觉得很通俗易懂 错误是指在执行代码过程中 ...

  2. 自动化测试之python基础什么是面对对象之类和对象

    前言 学习自动化测试需要掌握一门开发语言,Java.python这两个可以选一个,这里呢笔者推荐的是python语言,因为它比较好学,那么今天呢,笔者就来给大家介绍一下python基础中的面对对象之类 ...

  3. Python学习之变量、对象和引用

    Python学习之变量.对象和引用 文章目录 Python学习之变量.对象和引用 问题的引出 变量创建 变量类型 变量使用 动态类型 类型属于对象,而不是变量 对象的垃圾收集 参考资料 问题的引出 当 ...

  4. python学习笔记4(对象/引用;多范式; 上下文管理器)

    python学习笔记4(对象/引用:多范式; 上下文管理器) ### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象 21. 动态类型:对象/引用 对象和引用: 对象是 ...

  5. python学习高级篇(part9)--对象的引用计数

    学习笔记,仅供参考,有错必纠 文章目录 python 学习高级篇 类对象的特殊方法之`__str__()` 类对象的特殊方法之`__new__()` 对象的引用计数 什么是引用计数 对象的引用计数加1 ...

  6. 视频教程-爬虫微课5小时 Python学习路线-Python

    爬虫微课5小时 Python学习路线 十多年的Java和大数据开发和培训,精通Hadoop.Spark和Android开发,对于数据分析和挖掘有比较深的研究.曾在公司独立开发O2O项目e小时.网店项目 ...

  7. Python 学习 02 —— Python如何爬取数据

    文章目录 系列文章 二.Python 爬 虫 1.任务介绍 2.简介 3.基本流程 3.1.准备工作 3.1.1.分析页面 3.1.2.编码规范 3.1.3.导入模块 3.1.4.程序流程 3.2.获 ...

  8. python爬虫原理-python学习之python爬虫原理

    原标题:python学习之python爬虫原理 今天我们要向大家详细解说python爬虫原理,什么是python爬虫,python爬虫工作的基本流程是什么等内容,希望对这正在进行python爬虫学习的 ...

  9. 菜菜的Python学习日记 | Python类实验代码分享

    系列索引:菜菜的Python学习日记 | Python从入门到入土详解 Python类实验代码分享 编写程序,实现以下功能. (1)创建员工类Employee,属性有姓名name.能力值ability ...

  10. 深圳Python学习:Python几大问,你想知道的答案都在这里!-千锋

    深圳Python学习:Python几大问,你想知道的答案都在这里!-千锋 人们为什么使用Python? 之所以选择Python的主要因素有以下几个方面: 软件质量:在很大程度上,Python更注重可读 ...

最新文章

  1. java i 原子_为什么i ++不是原子的?
  2. asp.net的几种简单连接数据库方法
  3. Tensorflow实例3: 验证码图片的识别训练,每张图片有4个字母
  4. oledb vc访问mdb数据库_SQL SERVER数据库技术-1
  5. 基于单链表的生产者消费者问题
  6. App热补丁动态修复技术介绍
  7. mysql 客户端_Linux桌面应用之MySQL客户端DBeaver
  8. Spring学习总结(5)——IOC注入方式总结
  9. 【特色团队采访】慌呀哩团队,用简洁算法达成高效协作
  10. 进阶~Qt程序启动画面
  11. 解决:Conversion to Dalvik format failed: Unable to execute dex: null
  12. iso 绝对pe_通用PE工具箱 V5.0(WIN7PE内核)U盘ISO硬盘完美三合一版
  13. (离散)设函数 f:A→B,g:B→C,证明:若g °f是满射,则g是满射.
  14. 前端三件套之css笔记
  15. 赵小楼《天道》《遥远的救世主》深度解析(81)一个不愿躺着对话的女人,应给与绝对尊严,这符合强势文化范畴
  16. css3中斜杠_使用斜杠语法设置CSS3边界半径
  17. 说说org.json.JSONObject功能和源码(二)
  18. 仓库管理系统软件哪个好
  19. Arcgis主页面字体太小
  20. CentOS 8 安装NVIDIA-Linux显卡驱动

热门文章

  1. 什么是区块链钱包?区块链钱包如何运作?
  2. 2018-08-01-weekly
  3. REST Framework 的用户认证组件
  4. java应用cpu使用率过高问题排查
  5. 手把手教你使用C#操作SQLite数据库,新建数据库,创建表,插入,查询,删除,运算符,like(持续更新)...
  6. 1021. Deepest Root (25)
  7. Java发邮件-QQ服务器认证
  8. jQuery的ajax()、post()方法提交数组,参数[] 问题
  9. Css3系列-新属性新布局
  10. 北大百年讲堂创新大会小游记