# 面向对象的进阶
# 其他常用模块
# 作业 考试题
# 网络编程 2天
# ftp作业
# class A:pass
# class B(A):pass
# a = A()
# print(isinstance(a,A))返回true,判断a是不是A的对象
# print(issubclass(B,A))返回true,判断B是不是A的子类
# print(issubclass(A,B))》》》返回Flase
# 反射 : 是用字符串类型的名字 去操作 变量
# name = 1
# eval('print(name)') # 安全隐患
# 反射 就没有安全问题
# 反射 : 是用字符串类型的名字 去操作 变量
# 反射对象中的属性和方法 # hasattr getattr setattr delattr
# class A:
# def func(self):
# print('in func')
#
# a = A()
# a.name = 'alex'
# a.age = 63
# # 反射对象的属性
# ret = getattr(a,'name') # 通过变量名的字符串形式取到的值
# print(ret)
# print(a.__dict__)
# 变量名 = input('>>>') # func
# print(getattr(a,变量名))#如果不用面向对象的反射,也可以用if判断input输入内容是否等于‘name’来返回a.name的值
# print(a.__dict__[变量名])#不用反射、if判断,也可以用__dict__,但遇到需要执行func时,if和字典就不管用了,要用反射拿到方法的内存地址
#
# # 反射对象的方法
# a.func()
# ret = getattr(a,'func')
# ret()
#
# class A:
# price = 20
# @classmethod
# def func(cls):
# print('in func')
# # 反射类的属性
# # A.price
# print(getattr(A,'price'))
#
# # 反射类的方法 :classmethod staticmethod
# # A.func()
# if hasattr(A,'func'):#如果存在才执行
# getattr(A,'func')()
#模块(模块实际就是一个类,my是类名)
/*一个my的模块文件
day = 'Monday' # 周一
def wahaha():
print('wahahaha')
class C:
pass
*/
# import my
# 反射模块的属性
# print(my.day)
# print(getattr(my,'day'))
# 反射模块的方法
# getattr(my,'wahaha')()
# 内置模块也能用
# time
# asctime
# import time
# print(getattr(time,'time')())
# print(getattr(time,'asctime')())
# def qqxing():
# print('qqxing')
# year = 2018
# import sys
# # print(sys.modules['__main__'].year)#modules查看所有导入的模块,sys.modules['__main__']找到自己的模块
# # 反射自己模块中的变量
# # print(getattr(sys.modules['__main__'],'year'))
#
# # 反射自己模块中的函数
# # getattr(sys.modules['__main__'],'qqxing')()
# 变量名 = input('>>>')
# print(getattr(sys.modules[__name__],变量名))#取自己模块名字时,不应该用_main_写死,要想自己模块为其他模块A导入对象时这段代码还生效,尽量使用变量_name_来反射,因为此时的_main_不为_main_,而是'模块A名字'
# 要反射的函数有参数怎么办?
# print(time.strftime('%Y-%m-%d %H:%M:S'))
# print(getattr(time,'strftime')('%Y-%m-%d %H:%M:S'))
# 一个模块中的类能不能反射得到
# import my
# print(getattr(my,'C')())#拿到一个类C,加()实例化
# if hasattr(my,'name'):
# getattr(my,'name') hasattr和getattr常搭配使用,防止报错
总之,(什么.什么)这种样式都可以用反射来拿到
# 重要程度半颗星
# setattr 设置修改变量
class A:
pass
a = A()
setattr(a,'name','nezha') #添加到对象的空间
setattr(A,'name','alex') #添加到类的空间
print(A.name)
print(a.name)
# delattr 删除一个变量
delattr(a,'name') #这里是删除对象a里的name属性('nezha')
print(a.name) #对象a的name已被删除,所以找类A的name》》'alex'
delattr(A,'name') #类A的name已被删除,所以打印会报错,找不到name了
print(a.name)