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模块restful使用方法实例
Dec 10 Python
Python重新引入被覆盖的自带function
Jul 16 Python
python下如何查询CS反恐精英的服务器信息
Jan 17 Python
Python二叉树的定义及常用遍历算法分析
Nov 24 Python
Python3实现的简单验证码识别功能示例
May 02 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
Jul 11 Python
python 美化输出信息的实例
Oct 15 Python
利用python在excel里面直接使用sql函数的方法
Feb 08 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
Jul 01 Python
基于Python2、Python3中reload()的不同用法介绍
Aug 12 Python
python实现简易版学生成绩管理系统
Jun 22 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
Feb 25 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
CakePHP去除默认显示的标题及图标的方法
2008/10/22 PHP
php实现用户登陆简单实例
2017/04/04 PHP
详解php用static方法的原因
2018/09/12 PHP
详解php反序列化
2020/06/10 PHP
基于JQuery的6个Tab选项卡插件
2010/09/03 Javascript
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
jQuery中get和post方法传值测试及注意事项
2014/08/08 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
微信小程序中实现一对多发消息详解及实例代码
2017/02/14 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
React之PureComponent的使用作用
2018/07/10 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
Javascript通过控制类名更改样式
2019/05/24 Javascript
封装一下vue中的axios示例代码详解
2020/02/16 Javascript
Element MessageBox弹框的具体使用
2020/07/27 Javascript
基于JavaScript实现轮播图效果
2021/01/02 Javascript
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
Python如何实现的二分查找算法
2020/05/27 Python
用Python 执行cmd命令
2020/12/18 Python
html5 外链式实现加减乘除的代码
2019/09/04 HTML / CSS
加拿大百叶窗和窗帘定制网站:Blinds
2017/01/30 全球购物
什么是servlet
2012/05/08 面试题
计算机专业推荐信范文
2013/11/27 职场文书
学生打架检讨书1000字
2014/01/16 职场文书
企业内控岗位的职责
2014/02/07 职场文书
2014年妇产科工作总结
2014/12/08 职场文书
春节慰问信范文
2015/02/15 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
学校教代会开幕词
2016/03/04 职场文书
Windows Server 2012 R2服务器安装与配置的完整步骤
2022/07/15 Servers