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 RuntimeError: thread.__init__() not called解决方法
Apr 28 Python
Python函数返回值实例分析
Jun 08 Python
python遍历序列enumerate函数浅析
Oct 17 Python
Python3.8中使用f-strings调试
May 22 Python
Python Pandas 箱线图的实现
Jul 23 Python
django-filter和普通查询的例子
Aug 12 Python
PyCharm使用Docker镜像搭建Python开发环境
Dec 26 Python
selenium中get_cookies()和add_cookie()的用法详解
Jan 06 Python
Pytorch GPU显存充足却显示out of memory的解决方式
Jan 13 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
Jun 03 Python
Python requests接口测试实现代码
Sep 08 Python
如何在Python项目中引入日志
May 31 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中feof()函数实例测试
2014/08/23 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
php tpl模板引擎定义与使用示例
2019/08/09 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
键盘控制事件应用教程大全
2006/11/24 Javascript
javascript dom 操作详解 js加强
2009/07/13 Javascript
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
DWZ table的原生分页浅谈
2013/03/01 Javascript
Javascript操作URL函数修改版
2013/11/07 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
JavaScript的类型、值和变量小结
2015/07/09 Javascript
JS实现的左侧竖向滑动菜单效果代码
2015/10/19 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
React.Js添加与删除onScroll事件的方法详解
2017/11/03 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
浅谈Vue2.0中v-for迭代语法的变化(key、index)
2018/03/06 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
2020/04/08 Javascript
[46:44]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第二场 3月7日
2021/03/11 DOTA
python获得一个月有多少天的方法
2015/06/04 Python
基于python(urlparse)模板的使用方法总结
2017/10/13 Python
python构建深度神经网络(DNN)
2018/03/10 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
2019/07/11 Python
配置python的编程环境之Anaconda + VSCode的教程
2020/03/29 Python
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
英语自荐信范文
2013/12/11 职场文书
《临死前的严监生》教学反思
2014/02/13 职场文书
公务员保密承诺书
2014/03/27 职场文书
库房保管员岗位职责
2014/04/07 职场文书
我的大学生活演讲稿
2014/04/25 职场文书
个人考核材料
2014/05/15 职场文书
入党政审材料范文
2014/12/24 职场文书
运输公司工作总结
2015/08/11 职场文书
2016公司新年问候语
2015/11/11 职场文书
有关信念的名言语录集锦
2019/12/06 职场文书
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS