python-反射

# 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

导入my.py

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__], 变量名))  # 用这个不会报错

猜你喜欢

转载自blog.csdn.net/weixin_43409365/article/details/86718745