时间:2021-05-22
一、静态方法(staticmethod)和类方法(classmethod)
类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属×××互(也就是可以使用类属性)
静态方法:让类里的方法直接被类调用,就像正常调用函数一样
类方法和静态方法的相同点:都可以直接被类调用,不需要实例化
类方法和静态方法的不同点:
绑定方法:分为普通方法和类方法
二、反射
反射:可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),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里面存在不存在,结果是Trueprint(getattr(egg,'name')) #如果为True它才去得到,结果是egonprint(hasattr(egg,'func')) #结果是Trueprint(getattr(egg,'func')) #得到的是地址<bound method Foo.func of <__main__.Foo object at 0x0000000001DDA2E8>>getattr(egg,'func')() #在这里加括号才能得到,因为func是方法,结果是hello一般用法如下,先判断是否hasattr,然后取getattrif hasattr(egg,'func'): getattr(egg,'func')() #结果是helloelse: 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')) #结果是Truemethod = getattr(Foo,'class_method_dome')method() #结果是class_method_domeprint(hasattr(Foo,'static_method_dome')) #结果是Truemethod1 = getattr(Foo,'static_method_dome')method1() #结果是static_method_dome3、模块应用反射
# 1.导入其他模块引用
import mymoduleprint(hasattr(mymodule,'test'))getattr(mymodule,'test')()p = getattr(mymodule,'test')p() #相当于上面getattr(mymodule,'test')()# 2.在本模块中应用反射
def demo1(): print('hello')import sysmodule_obj = sys.modules[__name__] #相当于'__main__'print(module_obj) #结果是<module '__main__' from 'C:/Users/Administrator/Desktop/test.py'>print(hasattr(module_obj,'demo1')) #结果是Truegetattr(module_obj,'demo1')() #结果是hello导入自己的模块的例子:
def 注册(): print('regiester')def 登录(): print('login')def 购物(): passprint('注册,登录,购物')ret = input('请输入你要做的操作:')import sysmy_module = sys.modules[__name__] #利用sys模块导入一个自己的模块if hasattr(my_module,ret): getattr(my_module,ret)()以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了PHP反射机制原理与用法。分享给大家供大家参考,具体如下:反射面向对象编程中对象被赋予了自省的能力,而这个自省的过程就是反射。反射,直观理解就是根
下面通过实例代码给大家介绍Tomcat解析XML和反射创建对象原理,具体代码如下所示:importjava.lang.reflect.InvocationTar
本文实例讲述了php面向对象之反射功能与用法。分享给大家供大家参考,具体如下:个人对反射定义的理解:首先得说说什么叫反射。对于一个新手来说,反射这个概念常常给人
这篇文章主要介绍了Java多态中动态绑定原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下多态是面向对象
前言本篇将从以下几个方面讲述反射的知识:class的使用方法的反射构造函数的反射成员变量的反射一、什么是class类在面向对象的世界里,万物皆对象。类是对象,类