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 相关文章推荐
pyqt和pyside开发图形化界面
Jan 22 Python
flask中主动抛出异常及统一异常处理代码示例
Jan 18 Python
解决Pycharm无法import自己安装的第三方module问题
May 18 Python
Python高级特性与几种函数的讲解
Mar 08 Python
python机器人运动范围问题的解答
Apr 29 Python
pyqt5 使用cv2 显示图片,摄像头的实例
Jun 27 Python
PyCharm搭建Spark开发环境的实现步骤
Sep 05 Python
python 实现矩阵按对角线打印
Nov 29 Python
使用Python+selenium实现第一个自动化测试脚本
Mar 17 Python
java字符串格式化输出实例讲解
Jan 06 Python
安装不同版本的tensorflow与models方法实现
Feb 20 Python
Python日志模块logging用法
Jun 05 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
深入for,while,foreach遍历时间比较的详解
2013/06/08 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
全面理解面向对象的 JavaScript(来自ibm)
2013/11/10 Javascript
Nodejs中自定义事件实例
2014/06/20 NodeJs
jquery显示loading图片直到网页加载完成的方法
2015/06/25 Javascript
原生js模拟淘宝购物车项目实战
2015/11/18 Javascript
js replace()去除代码中空格的实例
2017/02/14 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
2017/10/19 Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
2018/04/13 Javascript
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
JavaScript实现一个简易的计算器实例代码
2018/05/10 Javascript
Vue.js图片预览插件使用详解
2018/08/27 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
使用Vue生成动态表单
2019/11/26 Javascript
Python实现PS滤镜中马赛克效果示例
2018/01/20 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
对numpy中的数组条件筛选功能详解
2018/07/02 Python
浅谈python脚本设置运行参数的方法
2018/12/03 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
连卡佛中国官网:Lane Crawford中文站
2018/01/27 全球购物
DOM和JQuery对象有什么区别
2016/11/11 面试题
疾病捐款倡议书
2014/05/13 职场文书
基层党员对照检查材料
2014/08/25 职场文书
向女朋友道歉的话
2015/01/20 职场文书
企业介绍信范文
2015/01/30 职场文书
大学生个人简历自我评价
2015/03/11 职场文书
目标责任书格式范文
2015/05/11 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
JavaScript 定时器详情
2021/11/11 Javascript
windows11怎么查看wifi密码? win11查看wifi密码的技巧
2021/11/21 数码科技
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server
Java版 单机五子棋
2022/05/04 Java/Android