Day 23 反射

Posted 欣蔚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day 23 反射相关的知识,希望对你有一定的参考价值。

 isinstance
isinstance(obj,cls)检查是否obj是类cls的对象
class Foo(object):
    pass
obj = Foo()
print(isinstance(obj,Foo))

issubclass
issubclass(sub,super)检查sub类是否是super的派生类
class Foo(object):
    pass

class Bar(Foo):
    pass

print(issubclass(Bar,Foo))

 python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
class Foo:
    role = person
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def func(self):
        print(hi,%s%self.name)

p = Foo(alex,26)
检查是否含有某属性 return whether the object has an attribute with the given name
# print(hasattr(p,‘name‘))
# 获取属性 getattr(object,name,default = None)
print(getattr(p,age)) #属性
print(getattr(p,func)) #方法
func = getattr(p,func)
func()
# 设置属性 setattr(x,y,z) sets the named attribute on the given object to the specified value
setattr(p,name,nero)
print(p.__dict__)
setattr(p,show_name,lambda self:self.name +sb)
print(p.show_name(p))
# 删除属性 delattr(x,y)   Deletes the named attribute from the given object.
delattr(p,age)
delattr(p,show_name)
delattr(p,show_name111) #报错

print(p.__dict__)
# 类也是对象
class Foo(object):
    staticField = old boy

    def __init__(self):
        self.name = wupeiqi

    def func(self):
        return func

    @staticmethod
    def bar():
        return bar

print(getattr(Foo,staticField))
print(getattr(Foo,func))
print(getattr(Foo,bar))
# 反射当成模块成员
import sys

def s1():
    print (s1)

def s2():
    print(s2)

this_module = sys.modules[__name__]

print(hasattr(this_module,s1))
print(getattr(this_module, s2))
# 导入其他模块,利用反射查找该模块是否存在某个方法
‘‘‘
程序目录:
module_test.py
index.py

当前文件:
index.py
‘‘‘

import model_test as obj

print(hasattr(obj,test))
getattr(obj,test)
# __len__
class A:
    def __init(self):
        self.a =1
        self.b =2

    def __len__(self):
        return len(self.__dict__)

a= A()
print(len(a))

#__hash__
class A:
    def __init__(self):
        self.a = 1
        self.b = 2
    def __hash__(self):
        return hash(str(self.a)+str(self.b))

a = A()
print(hash(a))
class A:
    role = person
    def func(self):
        print(**self)
# ret = input(‘>>>‘)
# print(A.__dict__[ret])
print(getattr(A,role))    # 从A的命名空间里找一个属性 ,直接就可以找到这个属性的值
f = getattr(A,func);f(2) # 从A的命名空间里找一个方法 ,找到的是这个方法的内存地址
getattr(A,func)(2)
A.func(2)
# 类使用类命名空间中的名字
# 对象使用对象能用的方法和属性
# 模块使用模块中的名字
默写1
class A:
    role = Person
    def __init__(self):
        self.money = 500
    def func(self):
        print(**10)

a = A()
print(a.func)
getattr(a,func)()
print(getattr(a,money))
默写2
def
login(): print(执行login功能) def register(): print(执行register功能) import sys # 和python解释器相关的内容都在sys里 print(sys.modules[__main__]) func = input(>>>) if hasattr(sys.modules[__main__],func): getattr(sys.modules[__main__],func)()

技术分享图片

 

技术分享图片

 

技术分享图片

技术分享图片


 

以上是关于Day 23 反射的主要内容,如果未能解决你的问题,请参考以下文章

DAY23JVM与反射的学习笔记

python之路--day23--面向对象高级

day21-反射&枚举

day21-反射&枚举

day21-反射&枚举

day7 反射