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解析发往本机的数据包示例 (解析数据包)
Jan 16 Python
Python contextlib模块使用示例
Feb 18 Python
使用Python脚本对Linux服务器进行监控的教程
Apr 02 Python
Python实现导出数据生成excel报表的方法示例
Jul 12 Python
Python中对象的引用与复制代码示例
Dec 04 Python
Python对CSV、Excel、txt、dat文件的处理
Sep 18 Python
Python OpenCV利用笔记本摄像头实现人脸检测
Aug 20 Python
python3 使用ssh隧道连接mysql的操作
Dec 05 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 Python
python爬虫scrapy框架之增量式爬虫的示例代码
Feb 26 Python
python爬取豆瓣电影TOP250数据
May 23 Python
python3实现常见的排序算法(示例代码)
Jul 04 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
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
2016/05/18 PHP
PHP实现递归目录的5种方法
2016/10/27 PHP
php7函数,声明,返回值等新特性介绍
2018/05/25 PHP
用于table内容排序
2006/07/21 Javascript
利用jquery的获取JS文件中的字符串内容
2012/02/14 Javascript
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
javascript中关于&amp;&amp; 和 || 表达式的小技巧分享
2015/04/10 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
12个非常有用的JavaScript技巧
2017/05/17 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
JavaScript 五大常见函数
2018/03/23 Javascript
详解vue中localStorage的使用方法
2018/11/22 Javascript
node(koa2) web应用模块介绍详解
2019/03/29 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
VUE使用 wx-open-launch-app 组件开发微信打开APP功能
2020/08/11 Javascript
pyqt4教程之widget使用示例分享
2014/03/07 Python
跟老齐学Python之网站的结构
2014/10/24 Python
Python文本相似性计算之编辑距离详解
2016/11/28 Python
Python 多核并行计算的示例代码
2017/11/07 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
解决在keras中使用model.save()函数保存模型失败的问题
2020/05/21 Python
深入了解NumPy 高级索引
2020/07/24 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
优秀生推荐信范文
2013/11/28 职场文书
毕业生实习鉴定
2013/12/11 职场文书
教师对学生的评语
2014/04/28 职场文书
舞蹈教育学专业自荐信
2014/06/15 职场文书
公务员中国梦演讲稿
2014/08/19 职场文书
2015学校图书管理员工作总结
2015/05/11 职场文书
python实现简易自习室座位预约系统
2021/06/30 Python
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android
JavaScript 原型与原型链详情
2021/11/02 Javascript