Python学习基础笔记六十二——反射2

1、

isinstanace(obj, cls) # 检查是否obj是否是类cls的对象:

class Foo(object):
    pass


obj = Foo()

print(isinstance(obj, Foo))

结果返回:True。

issubclass(sub, super) # 检查sub类是否是 super 类的派生类

class Foo(object):
    pass


class Bar(Foo):
    pass


print(issubclass(Bar, Foo))

结果返回为:True。

2、反射:

1)反射的概念是由smith在1982时首次提出,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这个概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在lisp和面向对象方面取得成就。

2)python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)。

四个可以实现自省的函数:

name = 1
eval(print(name))     # 安全隐患

使用反射,就没有安全问题。

3、反射对象的属性:

class A:
    def func(self):
        print(in func)


a = A()
a.name = alex

ret = getattr(a, name)   # 通过变量名的字符串形式取到值
print(ret)

4、反射对象的方法:

class A:
    def func(self):
        print(in func)


a = A()
a.name = alex

ret = getattr(a, func)
ret()

5、反射类的属性:

class A:
    price = 20
    @classmethod
    def func(cls):
        print(in func)


a = A()
a.name = alex

ret = getattr(A, price)
print(ret)

ret2 = getattr(A, func)
ret2()

6、反射模块的属性,反射模块的方法:另外,内置模块也能用。

# my.py

day = Monday    # 变量day

def wahaha():
    print(wahaha)
import my

ret = getattr(my, day)
print(ret)

ret2 = getattr(my, wahaha)
ret2()

7、反射自己模块的变量和方法:

8、一个模块中的类能不能反射得到。

import my

print(getattr(my, C)())

9、setattr:设置修改变量

class A:
    pass

a = A()

setattr(a, name, chang)
setattr(A, name, alex)

print(A.name)
print(a.name)

10、delattr:删除一个变量

class A:
    pass

a = A()

setattr(a, name, chang)
setattr(A, name, alex)

print(A.name)
print(a.name)

delattr(a, name)
print(a.name)

结果:

经验分享 程序员 微信小程序 职场和发展