# isinstance
# issubclass
class A:pass
class B(A):pass
a = A()
print(isinstance(a, A)) # 就是判断a对象是不是A类的对象 True
print(issubclass(B, A)) # 判断B是不是A的子类,子类要写在前面 True
反射 : 是用字符串类型的 名字去操作变量 ,没有安全隐患
name = 1
eval("print(name)")
# eval() 也能实现 , 但是eval()有安全隐患
# 反射对象中的属性和方法
class A:
def func(self):
print('in func')
a =A()
a.name = 'alex'
ret = getattr(a, 'name') # 通过字符串的形式取到的值
print(ret)
# 反射对象的属性
变量名 = input('>>>')
if 变量名 == 'name':
print(getattr(a, 'name'))
反射对象的方法
ret2 = getattr(a, 'func') # 拿到的是一个地址
ret2() # 加上括号才是执行
class A:
price = 30 # 静态属性
@classmethod
def func(self):
print('in func')
# 反射类的属性
print(getattr(A, 'price'))
# 反射类的方法(classmethod staticmethod)
if hasattr(A, 'func'):
ret = getattr(A, 'func')
ret()
写一个my.py,代码如下
day = 'Tuesday'
def wahaha():
print('hahahaha')
class C:
pass
import my
# 反射模块的属性
print(my.day)
print(getattr(my,'day'))
# 反射模块的方法
ret = getattr(my, 'wahaha')
ret()
# 内置模块也能用
def qqxing():
print('QQ星')
year = 2019
import sys
print(sys.modules)
print(sys.modules['__main__'].year)
# 反射自己模块中的变量
print(getattr(sys.modules['__main__'], 'year'))
# 如果自己这个模块变成了另一个模块导入的对象的话 这样写就会出错
# 反射自己模块中的函数
ret = getattr(sys.modules['__main__'], 'qqxing')
ret()
变量名 = input('>>>')
print(getattr(sys.modules[__name__], 变量名)) # 用这个不会报错