python面向对象 反射原理解析


Posted in Python onAugust 12, 2019

一、静态方法(staticmethod)和类方法(classmethod)

类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属×××互(也就是可以使用类属性)

静态方法:让类里的方法直接被类调用,就像正常调用函数一样

类方法和静态方法的相同点:都可以直接被类调用,不需要实例化

类方法和静态方法的不同点:

  • 类方法必须有一个cls参数表示这个类,可以使用类属性
  • 静态方法不需要参数

绑定方法:分为普通方法和类方法

  • 普通方法:默认有一个self对象传进来,并且只能被对象调用-------绑定到对象
  • 类方法:默认有一个cls对象传进来,并且可以被类和对象(不推荐)调用-----绑定到类
  • 非绑定方法:静态方法:没有设置默认参数,并且可以被类和对象(不推荐)调用-----非绑定
import time
class Date:
  def __init__(self,year,month,day):
    self.year=year
    self.month=month
    self.day=day
  # @staticmethod
  # def now():
  #   t=time.localtime()
  #   return Date(t.tm_year,t.tm_mon,t.tm_mday)
  @classmethod     #改成类方法
  def now(cls):
    t=time.localtime()
    return cls(t.tm_year,t.tm_mon,t.tm_mday) #哪个类来调用,即用哪个类cls来实例化
class EuroDate(Date):
  def __str__(self):
    return 'year:%s month:%s day:%s' %(self.year,self.month,self.day)
e=EuroDate.now()
print(e)        #我们想触发EuroDate.__str__,此时e就是由EuroDate产生的,结果如我们所愿
'''
输出结果:
year:2017 month:3 day:3
'''

二、反射

反射:可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),python中一切皆对象,都可以使用反射。

反射有四种方法:

hasattr:hasattr(object,name)判断一个对象是否有name属性或者name方法。有就返回True,没有就返回False

getattr:获取对象的属性或者方法,如果存在则打印出来。hasattr和getattr配套使用

需要注意的是,如果返回的是对象的方法,返回出来的是对象的内存地址,如果需要运行这个方法,可以在后面添加一对()

setattr:给对象的属性赋值,若属性不存在,先创建后赋值

delattr:删除该对象指定的一个属性

1、对象应用反射

class Foo:
  def __init__(self):
    self.name = 'egon'
    self.age = 51
  def func(self):
    print('hello')
egg = Foo()
print(hasattr(egg,'name'))   #先判断name在egg里面存在不存在,结果是True
print(getattr(egg,'name'))   #如果为True它才去得到,结果是egon
print(hasattr(egg,'func'))   #结果是True
print(getattr(egg,'func'))   #得到的是地址<bound method Foo.func of <__main__.Foo object at 0x0000000001DDA2E8>>
getattr(egg,'func')()    #在这里加括号才能得到,因为func是方法,结果是hello

一般用法如下,先判断是否hasattr,然后取getattr
if hasattr(egg,'func'):
  getattr(egg,'func')()  #结果是hello
else:
  print('没找到')

2、类应用反射

class Foo:
  f = 123
  @classmethod
  def class_method_dome(cls):
    print('class_method_dome')
  @staticmethod
  def static_method_dome():
    print('static_method_dome')    
print(hasattr(Foo,'class_method_dome'))     #结果是True
method = getattr(Foo,'class_method_dome')
method()                #结果是class_method_dome

print(hasattr(Foo,'static_method_dome'))     #结果是True
method1 = getattr(Foo,'static_method_dome')
method1()               #结果是static_method_dome

3、模块应用反射

# 1.导入其他模块引用

import mymodule
print(hasattr(mymodule,'test'))
getattr(mymodule,'test')()
p = getattr(mymodule,'test')
p()               #相当于上面getattr(mymodule,'test')()

# 2.在本模块中应用反射

def demo1():
  print('hello')
import sys
module_obj = sys.modules[__name__]    #相当于'__main__'
print(module_obj)         #结果是<module '__main__' from 'C:/Users/Administrator/Desktop/test.py'>
print(hasattr(module_obj,'demo1'))    #结果是True
getattr(module_obj,'demo1')()     #结果是hello

导入自己的模块的例子:

def 注册():
  print('regiester')
def 登录():
  print('login')
def 购物():
  pass
print('注册,登录,购物')
ret = input('请输入你要做的操作:')
import sys
my_module = sys.modules[__name__] #利用sys模块导入一个自己的模块
if hasattr(my_module,ret):
  getattr(my_module,ret)()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 递归函数详解及实例
Dec 27 Python
一步步教你用Python实现2048小游戏
Jan 19 Python
通过源码分析Python中的切片赋值
May 08 Python
解决Tensorflow安装成功,但在导入时报错的问题
Jun 13 Python
python 对txt中每行内容进行批量替换的方法
Jul 11 Python
Flask web开发处理POST请求实现(登录案例)
Jul 26 Python
Python3网络爬虫中的requests高级用法详解
Jun 18 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
Aug 13 Python
python对指定字符串逆序的6种方法(小结)
Apr 02 Python
python能做哪些生活有趣的事情
Sep 09 Python
 分享一个Python 遇到数据库超好用的模块
Apr 06 Python
Python时间操作之pytz模块使用详解
Jun 14 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
Aug 12 #Python
Django 查询数据库并返回页面的例子
Aug 12 #Python
python3 深浅copy对比详解
Aug 12 #Python
Django获取该数据的上一条和下一条方法
Aug 12 #Python
python中的反斜杠问题深入讲解
Aug 12 #Python
Django CBV与FBV原理及实例详解
Aug 12 #Python
Python利用requests模块下载图片实例代码
Aug 12 #Python
You might like
浅析Yii2缓存的使用
2016/05/10 PHP
Yii2.0实现的批量更新及批量插入功能示例
2019/01/29 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
JQuery select标签操作代码段
2010/05/16 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
2010/10/20 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
Javascript中设置默认参数值示例
2014/09/11 Javascript
Angularjs的Controller间通信机制实例分析
2016/11/07 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
Webpack实现按需打包Lodash的几种方法详解
2017/05/08 Javascript
ES6下子组件调用父组件的方法(推荐)
2018/02/23 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
layui操作列按钮个数和文字颜色的判断实例
2019/09/11 Javascript
vue实现移动端触屏拖拽功能
2020/08/21 Javascript
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
python实现kMeans算法
2017/12/21 Python
单利模式及python实现方式详解
2018/03/20 Python
Python实现求解括号匹配问题的方法
2018/04/17 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
2018/05/30 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
2018/12/12 Python
Flask之请求钩子的实现
2018/12/23 Python
python tkinter实现屏保程序
2019/07/30 Python
详解pyinstaller selenium python3 chrome打包问题
2019/10/18 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
python中68个内置函数的总结与介绍
2020/02/24 Python
使用pytorch 筛选出一定范围的值
2020/06/28 Python
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
2016/12/16 HTML / CSS
公司JAVA开发面试题
2015/04/02 面试题
电子信息专业自荐书
2014/02/04 职场文书
公开服务承诺制度
2014/03/26 职场文书
2015年生产部工作总结范文
2015/05/25 职场文书
春晚观后感
2015/06/11 职场文书
机器人瓦力观后感
2015/06/12 职场文书
2015暑期工社会实践报告
2015/07/13 职场文书
详解java如何集成swagger组件
2021/06/21 Java/Android
python 多态 协议 鸭子类型详解
2021/11/27 Python