python学习day27 反射 内置的类方法

isinstance(obj,cls) 检查obj是否是cls类的对象

issubclass(sub,super) 检查sub类是否是super类的子类

反射

是用字符串类型的名字 去操作 变量

为什么不用eval()?

name = 1
eval('print(name)')   # 1

因为eval()操作的是一个字符串代码,这段字符串我们拿过来对立面的信息什么都不知道,会有很大的安全隐患

而反射只是通过字符串来操作内存里的变量

  • setattr
  • delattr
  • getattr
  • hasattr

反射对象的属性和方法

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

a = A()
a.name = 'alex'
a.age = 63

# 反射对象的属性
ret = getattr(a, 'name')  # 通过变量名的字符串形式取到的值
print(ret)  # 'alex'
print(a.__dict__)  # 查看对象a中的所有属性
变量名 = input('>>>')   # func
print(getattr(a, 变量名))
print(a.__dict__[变量名])  #也可以通过这样来调用属性

# 反射对象的方法
a.func()
ret = getattr(a,'func')
ret()  # 执行方法

反射的属性和方法

class A:
    price = 20  # 静态属性
    @classmethod
    def func(cls):
        print('in func')


# 反射类的属性 print(getattr(A,'price')) # 反射类的方法 :classmethod staticmethod if hasattr(A,'func'): getattr(A,'func')()

反射模块的属性和方法

定义模块my.py

day = 'Monday'

def wahaha():
    print('wahaha')

反射

import my
# 反射模块的属性
print(my.day)
print(getattr(my,'day'))

# 反射模块的方法
getattr(my,'wahaha')()

反射当前模块的属性和方法

def qqxing():
    print('qqxing')
year = 2018
import sys
# print(sys.modules['__main__'].year)  # sys.modules查看当前模块的名字

# 反射自己模块中的变量
print(getattr(sys.modules['__main__'],'year'))

# 反射自己模块中的函数
getattr(sys.modules['__main__'],'qqxing')()
变量名 = input('>>>')
print(getattr(sys.modules[__name__],变量名))  # 一般情况下用__name__变量 获取当前模块的名字

要反射的函数中有参数怎么办?

import time

print(time.strftime('%Y-%m-%d %H:%M:S'))  # 为时间打上格式
print(getattr(time,'strftime')('%Y-%m-%d %H:%M:S'))  # 后面传参就行了

setattr和delattr   (不重要)

# setattr  设置修改变量
class A:
    pass
a = A()
setattr(a,'name','nezha')
setattr(A,'name','alex')
print(A.name)
print(a.name)

# delattr 删除一个变量
delattr(a, 'name')
print(a.name)  # alex
delattr(A,'name')
print(a.name)  # 报错

__str__和__repr__

__del__

item系列

__getitem__

__setitem__

__delitem__

猜你喜欢

转载自www.cnblogs.com/happyfan/p/10152581.html