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)
结果:
