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+django实现文件上传
Jan 17 Python
基于python的Tkinter编写登陆注册界面
Jun 30 Python
Python中import机制详解
Nov 14 Python
Python对多属性的重复数据去重实例
Apr 18 Python
Python爬虫常用小技巧之设置代理IP
Sep 13 Python
numpy求平均值的维度设定的例子
Aug 24 Python
4行Python代码生成图像验证码(2种)
Apr 07 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
python报错: 'list' object has no attribute 'shape'的解决
Jul 15 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
Dec 29 Python
七个非常实用的Python工具包总结
Jun 15 Python
Python实现批量将文件复制到新的目录中再修改名称
Apr 12 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学习笔记之一
2011/01/17 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
php画图实例
2014/11/05 PHP
CI框架中通过hook的方式实现简单的权限控制
2015/01/07 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
2017/05/30 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
JSON辅助格式化处理方法
2013/03/26 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
jQuery Validate表单验证插件 添加class属性形式的校验
2016/01/18 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
CentOS环境中MySQL修改root密码方法
2018/01/07 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
微信小程序canvas拖拽、截图组件功能
2018/09/04 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
基于python的Tkinter实现一个简易计算器
2015/12/31 Python
python实现中文转换url编码的方法
2016/06/14 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
Python smtplib实现发送邮件功能
2018/05/22 Python
python 读取视频,处理后,实时计算帧数fps的方法
2018/07/10 Python
3行Python代码实现图像照片抠图和换底色的方法
2019/10/10 Python
Python过滤掉numpy.array中非nan数据实例
2020/06/08 Python
python 利用Pyinstaller打包Web项目
2020/10/23 Python
应届生骨科医生求职信
2013/10/31 职场文书
捐书活动总结
2014/05/04 职场文书
节水标语大全
2014/06/11 职场文书
2015年女工委工作总结
2015/07/27 职场文书
2016民族团结先进个人事迹材料
2016/02/26 职场文书
gojs实现蚂蚁线动画效果
2022/02/18 Javascript
Go归并排序算法的实现方法
2022/04/06 Golang