• 面对对象中的反射


    #反射:把凡是对象.属性(变量或函数,方法)的这样的形式都可以转换成对象于字符串的形式,在这个转换
    #过程中要用到四个函数,分别是hasattr(),getattr(),setattr(),delattr()
    #这里的对象指向很广,不仅有类的实例化对象,类本身,还有模块,所有能写成xx.yy的,xx就是所说的对象
    #hasattr(),getattr(),setattr(),delattr()等作用和说明
    #hasattr(obj,name)obj可以是对象(或类),name是属性的字符串,hasattr的作用是判断
    #obj是否有该字符串,可看成obj.name1是否定义了.其本质上是在obj.__dict__的字典中是否存在该key值,
    # 即if name in obj.__dict__,这里的name只是一个代表,是一个字符串
    #getattr(obj,name)返回该对象的字符串的值,可看成是res =obj.name1,取res
    # 即res = obj.__dict__[name],取res值
    #setattr(obj,name,value)该该对象的字符串赋值,可看成obj.name1=value
    # 即obj.__dict__[name]=value
    #delattr(obj,name)删除该对象的字符串,可看成del obj.name1
    # 即del obj.__dict__[name]
    #注:(obj,name)中的name是字符串,而obj.name1中的name1是属性(变量或函数),它们是不同的
    """
    =====对象是类,或是类实例化的对象
    class People:
    country = 'china'
    def __init__(self,name):
    self.name =name

    def walk(self):
    print('%s walk'%self.name)

    p =People('egon')#类的实例化,就会触发__init__方法(如果有),就会执行__init__中的代码
    print(People.walk) #形式是obj.name,其中obj是类名People,name是walk,所以类能反射
    print(hasattr(People,'walk'))#其中hasattr(obj,name),obj是类名People,name是'walk'
    #它的作用是先判断People.walk是否存在,然后打印True or False
    print(p.walk)#形式是obj.name,其中obj是类的实例化对象,name是walk,所以对象也能反射
    print(hasattr(p,'walk'))#其中hasattr(obj,name),obj是实例化对象p,name是'walk'
    #先判断p.walk是否存在,然后打印True or False,即if 'walk' in p.__dict__(People.__dict__)

    print(getattr(People,'walk'))#先读取People.walk的值,然后把该值打印
    print(getattr(p,'walk'))#先读取p.walk的值,然后把该值打印
    print(getattr(p,'walk11','不存在该walk属性'))#先是判断p.walk是否存在,如果存在就读取该值,
    #并打印出来,如果不存在就读取‘不存在该walk属性’,并把它打印出来
    print(getattr(p,'name'))
    setattr(p,'name',123)
    print(getattr(p,'name'))
    #注:getattr(obj,name(字符串类),sss),当obj.name(属性)不存在时,getattr函数返回的是sss(字符串)
    # name(属性)与name(字符串)是不同的,name(属性)是变量名或是函数名,它没有类型,但是
    # name(字符串)是字符串型
    """
    """
    #反射当前模块的属性
    import sys

    x =100
    class Foo:
    print('from class Foo')#它虽然在类Foo中,但是不在类Foo的名称空间中,它在当前脚本空间中

    def s1():
    print('s1')

    def s2():
    print('from to s2')

    #在当前位置使用该模块
    this_module = sys.modules[__name__]#在当前脚本中把它以上的内容当成模块,然后把该模块赋值
    #并把模块的内容执行一遍
    print(this_module)
    #print(this_module.__dict__)
    print(this_module.s1)
    print(hasattr(this_module,'s1'))
    print(this_module.x)
    print(hasattr(this_module,'x'))
    print(this_module.Foo.__dict__)
    print(hasattr(this_module,'Foo'))
    """

    """
    #把输入的模块名(python中存在的模块),当成模块使用
    # import importlib
    # t=importlib.import_module('time') #把字符串转化为模块名,相当于t =import time
    # print(t.time())
    """
  • 相关阅读:
    【转】Java并发编程:synchronized
    【转】Java并发编程:Thread类的使用
    【转】Java并发编程:如何创建线程?
    【计算机二级C语言】卷005
    【计算机二级C语言】卷004
    【计算机二级C语言】卷003
    【计算机二级C语言】卷002
    【计算机二级C语言】卷001
    汇编窥探Swift String的底层
    【KakaJSON手册】08_其他用法
  • 原文地址:https://www.cnblogs.com/IQ-Python/p/6758442.html
Copyright © 2020-2023  润新知