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常用内置函数总结
Feb 08 Python
Python 自动化表单提交实例代码
Jun 08 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
Aug 30 Python
Python中property属性实例解析
Feb 10 Python
python 列表,数组和矩阵sum的用法及区别介绍
Jun 28 Python
python 自动去除空行的实例
Jul 24 Python
对Python Pexpect 模块的使用说明详解
Feb 14 Python
用Python+OpenCV对比图像质量的几种方法
Jul 15 Python
Python Django框架防御CSRF攻击的方法分析
Oct 18 Python
Python数据分析pandas模块用法实例详解
Nov 20 Python
Python多进程编程multiprocessing代码实例
Mar 12 Python
快速解决jupyter notebook启动需要密码的问题
Apr 21 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
PHP安全配置
2006/12/06 PHP
php at(@)符号的用法简介
2009/07/11 PHP
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
thinkphp项目如何自定义微信分享描述内容
2017/02/20 PHP
YII框架批量插入数据的方法
2017/03/18 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
2014/12/08 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
2015/02/13 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
nodejs中向HTTP响应传送进程的输出
2017/03/19 NodeJs
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
vue父组件向子组件动态传值的两种方法
2017/11/11 Javascript
vue中使用百度脑图kityminder-core二次开发的实现
2019/09/26 Javascript
vue实现节点增删改功能
2019/09/26 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
python实现获取客户机上指定文件并传输到服务器的方法
2015/03/16 Python
Python中的一些陷阱与技巧小结
2015/07/10 Python
Python实现的HMacMD5加密算法示例
2018/04/03 Python
pandas groupby 分组取每组的前几行记录方法
2018/04/20 Python
python生成器用法实例详解
2019/11/22 Python
python求numpy中array按列非零元素的平均值案例
2020/06/08 Python
python中pivot()函数基础知识点
2021/01/03 Python
CSS书写规范、顺序和命名规则
2014/03/06 HTML / CSS
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
计算机软件个人的自荐信范文
2013/12/01 职场文书
自考毕业自我鉴定
2014/03/18 职场文书
银行优秀员工事迹材料
2014/05/29 职场文书
高一军训的心得体会
2014/09/01 职场文书
小学生田径运动会广播稿
2014/09/11 职场文书
南湾猴岛导游词
2015/02/09 职场文书