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判断一个集合是否包含了另外一个集合中所有项的方法
Jun 30 Python
matlab中实现矩阵删除一行或一列的方法
Apr 04 Python
python调用tcpdump抓包过滤的方法
Jul 18 Python
python实现五子棋小游戏
Mar 25 Python
Python中的元组介绍
Jan 28 Python
利用Python复制文件的9种方法总结
Sep 02 Python
Python中输入和输出(打印)数据实例方法
Oct 13 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
Oct 17 Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
Mar 08 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
Mar 14 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 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
改德生G88 - 加装等响度低音提升电路
2021/03/02 无线电
PHP面向对象编程快速入门
2006/10/09 PHP
php使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
PHP弹出对话框技巧详细解读
2015/09/26 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
2012/08/24 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
JavaScript:Array类型全面解析
2016/05/19 Javascript
小程序实现多选框功能
2018/10/30 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
webpack4 配置 ssr 环境遇到“document is not defined”
2019/10/24 Javascript
vue video和vue-video-player实现视频铺满教程
2020/10/30 Javascript
python ip正则式
2009/05/07 Python
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
Python OpenCV实现图片上输出中文
2018/01/22 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
2019/10/30 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
2020/03/12 Python
python 星号(*)的多种用途
2020/09/21 Python
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
瑞士国际航空官网:SWISS
2016/07/21 全球购物
毕业实习评语
2014/02/10 职场文书
合作与交流自我评价
2015/03/09 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
甲午大海战观后感
2015/06/02 职场文书
MySQL一些常用高级SQL语句
2021/07/03 MySQL
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL
讨论nginx location 顺序问题
2022/05/30 Servers