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、反射自己模块的变量和方法:
import sys
def qqxing():
print('qqxing')
year = 2023
print(getattr(sys.modules['__main__'], 'year'))
getattr(sys.modules['__main__'], 'qqxing')()
import sys
def qqxing():
print('qqxing')
year = 2023
arg = input('>>>')
print(getattr(sys.modules['__main__'], arg))
# print(getattr(sys.modules['__main__'], 'year'))
# getattr(sys.modules['__main__'], 'qqxing')()
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)
结果: