博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
八. python面向对象(反射和内置方法)
阅读量:6061 次
发布时间:2019-06-20

本文共 7676 字,大约阅读时间需要 25 分钟。

一 . 反射

# 反射:是用字符串类型的名字 取获取变量方法操作
# hasattr() # getattr() # delattr() # setattr()
# isinstance(obj,cls) 检查是否obj是否是类 cls的对象class Lo(object):       passaa=Lo()print(isinstance(aa,Lo))# issubclass(sub,super) 检查sub类是否是super的派生类(子类)class A:passclass B(A):passprint(issubclass(B,A))print(issubclass(A,B))

 1.getattr

class Da(object):    cc="188888"    def __init__(self,name):        self.name=name    def aa(self):        print("反射!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11")f=Da("张三")cc=getattr(f,'aa')cc()print("**********************************************")f.aa()
class A:    def fun(self):        print("哈哈哈哈哈哈!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")a=A()a.name="张三"a.age=25# 反射对象的属性ret=getattr(a,"name")  # 通过字符串取到的值print(ret)print("**********************")# 反射对象的方法r=getattr(a,"fun")r()print(a.__dict__)
# 反射类的方法 classmethod staticmethodclass B:    bb=20    @classmethod    def fun(self):        print("!!!!!!!!!!")print(B.bb)# 20# 反射类属性ret=getattr(B,"bb")print(ret)# 20# 反射类方法re=getattr(B,"fun")re()  # !!!!!!!!!!

反射模块

# my.py 文件day='Monday' #  周一def Gun():    print("模块中!!!!!!!!!!!!!!反射")
# 模块# 反射模块的属性import  myr=getattr(my,"day")print(r)# 反射模块的方法ret=getattr(my,'Gun')ret()
import  sys# 内置模块也能用# 反射自己模块中的变量(就是本模块)def Gn():    print("44444444444444")ye=1111111111print(sys.modules['__main__'].ye)k=getattr(sys.modules['__main__'],"ye")print(k)# 反射自己模块中的方法(函数)t=getattr(sys.modules['__main__'],"Gn")t()ff=input(">>>>")gg=getattr(sys.modules['__main__'],ff)print(gg) 二.
# 把自己变成自己的模块 import  sys aa=sys.modules[__name__] print(aa) x=122222222222 print(hasattr(aa,"x")) # True print(getattr(aa,"x")) # 122222222222

 二. 内置方法

 2.__delattr__ 

__delattr__  删除一个会促发这个方法
class Foo(object):         x=1    def __init__(self,y):         self.y=y    def __delattr__ (self,item):        print("执行 __delattr__ 方法")a1=Foo(10)del a1.y    # 执行 __delattr__ 方法del a1.x
3.__setattr__
# __setattr__   设置属性时会促发 __setattr__
ass Foo(object):    x = 1    def __init__(self, y):        self.y = y    def __setattr__(self, key, value):        # self.key=value   # 这样设置是不行的        self.__dict__[key] = value        print("执行 __setattr__ 方法")a1 = Foo(10)print(a1.__dict__)# 执行 __setattr__ 方法# {'y': 10}a1.z = 10000print(a1.__dict__)# 执行 __setattr__ 方法# {'y': 10, 'z': 10000}
# __setattr__   设置属性时会促发 __setattr__   class Foo(object):    def __init__(self,name):        self.name=name    def __setattr__(self,key,value):        self.__dict__[key]=value        print("执行__setattr__方法",key,value)a2=Foo("张三")a2.age="25岁"a2.sex="男"print(a1.__dict__)"""执行__setattr__方法 name 张三执行__setattr__方法 age 25岁执行__setattr__方法 sex 男{'name': '张三'}"""
#   class Faa(object):    def __init__(self,name):        self.name=name    def __setattr__(self,key,value):        if type(value) is str:            print("执行__setattr__方法",key,value)            self.__dict__[key]=value       else:           print("必须是字符串")a3=Faa("张三")a3.age="25岁"a3.sex="男"a3.shenggao=188  #  type 是数字就添加不进去print(a3.__dict__)"""执行__setattr__方法 name 张三执行__setattr__方法 age 25岁执行__setattr__方法 sex 男{'name': '张三', 'age': '25岁', 'sex': '男'}"""
4. __getattr__
# __getattr__  调用你一个对象不存在的属性才会促发   但是不会报错class Fo(object):    def __init__(self, name):        self.name = name    def __getattr__(self, item):        print("你找的属性[%s]不存在" % item)a1 = Fo("张三")print(a1.name)print(a1.age)"""张三你找的属性[age]不存在None"""
class Foo(object):    x = 1    def __init__(self, y):        self.y = y    def __getattr__(self, item):        print("执行__getattr__方法")a1 = Foo(10)print(a1.y)  # 10print(getattr(a1, 'y'))  # 10a1.ddddddddddddddddddddddddd  # 执行__getattr__方法
class Get(object):     passprint(Get.__dict__)     # {'__module__': '__main__', '__dict__': 
, '__weakref__':
, '__doc__': None}print(dir(Get)) # ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
# __delattr__  删除一个会促发这个方法class Fa(object):    def __init__(self,name):        self.name=name    def __setattr__(self,key,value):       if type(value) is str:            print("执行__setattr__方法",key,value)            self.__dict__[key]=value       else:           print("必须是字符串")    def __delattr__ (self,item):        print("执行 __delattr__ 方法",item)a4=Fa("张三")a4.age="25岁"a4.sex="男"a4.shenggao=188  #  type 是数字就添加不进去print(a3.__dict__)del a4.name"""执行__setattr__方法 name 张三执行__setattr__方法 age 25岁执行__setattr__方法 sex 男必须是字符串{'name': '张三', 'age': '25岁', 'sex': '男'}执行 __delattr__ 方法 name"""
# __getattr__        __setattr__      __delattr__class Da(object):    def __init__(self,al,we):        self.al=al        self.we=we    def aa(self):        print(11111111111111111)     # 获取没有的属性触发    def __getattr__(self, item):        print(item)        print("当对象调用类里面没有的属性才会触发 __getattr__")    # 设置触发    def __setattr__(self, key, value):        print(key,value,"------这是设置就会触发__setattr__")     # 删除触发    def __delattr__(self, item):        print(item,"删除就触发他吧")cc = Da("张三",5555)cc.bb# bb# 当对象调用类里面没有的属性才会触发 __getattr__print("**************************************************************************")del cc.al# al 张三 ------这是设置就会触发__setattr__# we 5555 ------这是设置就会触发__setattr__# bb# 当对象调用类里面没有的属性才会触发 __getattr__# **************************************************************************# al 删除就触发他吧
查看方法 或者是函数class Da(object):    def aa(self):        print(11111111111111111)cc = Da()# 
#

 

这是 aa.pydef f1():    print("f1")def f2():    print("f2")def f3():    print("f4")def f5():    print("f5")a=1
import  aaprint(hasattr(aa,"a"))  # Trueprint(hasattr(aa,"bb"))  # Falsevv=setattr(aa,"a",999)print(vv)  # Noneprint(getattr(aa,"a"))  # 999setattr(aa,"f1",lambda x:x+1)f=getattr(aa,"f1")p=f(1)print(p)  # 2
from  types import FunctionType # # 判断是否是个函数import  aawhile True:   inu=input("输入你想要实现的功能啊哈哈哈哈")   if hasattr(aa,inu):        bb=getattr(aa,inu)        if isinstance(bb,FunctionType):              bb()        else:         print(bb)   else:        print("输入的函数模块中没有")
class Dog(object):     ret = ["aa", "bb", "cc"]     lover="你妹的"     def __init__(self,name,age):         self.name=name         self.age=age     def aa(self):         print("111111111111111111")     def bb(self):         print("22222222222222222")     def  cc(self):         print(self.lover)     def run(self):       while True:        spek=input("输入列表中>>>>").strip()        for i in self.ret:            if i ==spek:                g=getattr(self,spek)                g()                break        else:            print("输入错误了")cc=Dog("金毛",55)cc.run()
class Dog(object):    ret = ["aa", "bb", "cc"]    lover = "你妹的"    def __init__(self, name, age):        self.name = name        self.age = age    def aa(self):        print("111111111111111111")    def bb(self):        print("22222222222222222")    def cc(self):        print(self.lover)    def run(self):        while True:            spek = input("输入列表中>>>>").strip()            if spek in self.ret:                f = getattr(self, spek)                f()            else:                print("你输入的有误哈哈哈")cc = Dog("金毛", 55)cc.run()
# 利用反射动态导入模块  执行模块中的函数imp = input("请输入你想导入的模块名:")CC = __import__(imp)  # 這种方式就是通过输入字符串导入你所想导入的模块CC.f1()  # 执行模块中的f1方法print("******************************************")imp = input("请输入模块:")dd = __import__(imp)# 等价于import impinp_func = input("请输入要执行的函数:")f = getattr(dd, inp_func,None)  # 作用:从导入模块中找到你需要调用的函数inp_func,然后返回一个该函数的引用.没有找到就烦会Nonef()  # 执行该函数

 

转载于:https://www.cnblogs.com/Sup-to/p/10884341.html

你可能感兴趣的文章
Struts07---访问servlet的API
查看>>
Lehman Brothers NY面经
查看>>
企业高并发的成熟解决方案(一)video(笔记&知识点)
查看>>
Java代码执行顺序及多态体现
查看>>
MySQL优化心得
查看>>
虚拟键盘 input 挡住
查看>>
Mac 常用命令介绍
查看>>
无需任何软件!斐讯K2 V22.x.xx.xx版本刷机教程(2016年11月更新)
查看>>
MATLAB读写Excel文件中的数据
查看>>
65. Valid Number
查看>>
.net 后台判断是否要替换
查看>>
微软TFS漏洞能下载服务器源码,独家首发
查看>>
js页面跳转整理
查看>>
关于远程连接MySQL数据库的问题解决
查看>>
laravel之null替换空字符串中间件
查看>>
jQuery基础之一
查看>>
【SICP练习】100 练习2.76
查看>>
冲刺博客 九
查看>>
(八)javaScript对象简介
查看>>
数据库如何创建视图create view
查看>>