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中bisect模块用法实例
Sep 25 Python
使用Python3编写抓取网页和只抓网页图片的脚本
Aug 20 Python
Python中的异常处理相关语句基础学习笔记
Jul 11 Python
基于python中pygame模块的Linux下安装过程(详解)
Nov 09 Python
Python实现PS图像抽象画风效果的方法
Jan 23 Python
用Python shell简化开发
Aug 08 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
Jun 10 Python
Python 依赖库太多了该如何管理
Nov 08 Python
np.random.seed() 的使用详解
Jan 14 Python
django实现将后台model对象转换成json对象并传递给前端jquery
Mar 16 Python
深入浅析pycharm中 Make available to all projects的含义
Sep 15 Python
Python常用GUI框架原理解析汇总
Dec 07 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通过递归方式复制目录和子目录的方法
2015/03/13 PHP
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
2015/10/08 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
2016/01/21 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
详解在Javascript中进行面向切面编程
2019/04/28 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
JavaScript实现模态对话框实例
2020/01/13 Javascript
如何在vue中使用jointjs过程解析
2020/05/29 Javascript
[41:56]Spirit vs Liquid Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python实现nao机器人手臂动作控制
2019/04/29 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
python3实现单目标粒子群算法
2019/11/14 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
python如何获得list或numpy数组中最大元素对应的索引
2020/11/16 Python
python 实现Requests发送带cookies的请求
2021/02/08 Python
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
韩国CJ食品专卖网:CJonmart
2016/09/11 全球购物
柏林通行证:Berlin Pass
2018/04/11 全球购物
什么是属性访问器
2015/10/26 面试题
写自荐信的注意事项
2014/03/09 职场文书
保险公司年会主持词
2014/03/22 职场文书
文艺演出策划方案
2014/06/07 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
三严三实对照检查材料
2014/09/22 职场文书
小学中队活动总结
2015/05/11 职场文书
运动会主持词大全
2015/07/02 职场文书
给领导敬酒词
2015/08/12 职场文书
如何做好工作总结!
2019/04/10 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
MySQL 角色(role)功能介绍
2021/04/24 MySQL
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript