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快速排序代码实例
Nov 21 Python
python基础教程之面向对象的一些概念
Aug 29 Python
简单总结Python中序列与字典的相同和不同之处
Jan 19 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
python中利用xml.dom模块解析xml的方法教程
May 24 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
May 30 Python
django项目用higcharts统计最近七天文章点击量
Aug 17 Python
Python基于内置库pytesseract实现图片验证码识别功能
Feb 24 Python
Python使用Selenium实现淘宝抢单的流程分析
Jun 23 Python
python3获取控制台输入的数据的具体实例
Aug 16 Python
Python Pandas知识点之缺失值处理详解
May 11 Python
python缺失值的解决方法总结
Jun 09 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
MVC模式的PHP实现
2006/10/09 PHP
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
php中curl使用指南
2015/02/05 PHP
php+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
Zend Framework实现多文件上传功能实例
2016/03/21 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
获取当前网页document.url location.href区别总结
2008/05/10 Javascript
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
利用JQuery和JS实现奇偶行背景颜色自定义效果
2012/11/19 Javascript
javascript中判断一个值是否在数组中并没有直接使用
2012/12/17 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
微信小程序 slider的简单实例
2017/04/19 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
详解nodejs模板引擎制作
2017/06/14 NodeJs
React之PureComponent的使用作用
2018/07/10 Javascript
node.js实现为PDF添加水印的示例代码
2018/12/05 Javascript
JS实现简单打字测试
2020/06/24 Javascript
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
浅谈Python程序与C++程序的联合使用
2015/04/07 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
pytorch 修改预训练model实例
2020/01/18 Python
mac在matplotlib中显示中文的操作方法
2020/03/06 Python
python连接mysql数据库并读取数据的实现
2020/09/25 Python
整理HTML5中支持的URL编码与字符编码
2016/02/23 HTML / CSS
实习生个人的自我评价
2013/12/08 职场文书
简单英文演讲稿
2014/01/01 职场文书
外企财务年会演讲稿
2014/01/03 职场文书
企业优秀员工事迹材料
2014/05/28 职场文书
服装设计专业自荐信
2014/06/17 职场文书
农村党建工作汇报材料
2014/10/27 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
python munch库的使用解析
2021/05/25 Python