面向对象进阶-反射(二)重要知识点

# 面向对象的进阶
# 其他常用模块
# 作业 考试题
# 网络编程 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)

转载于:https://www.cnblogs.com/mys6/p/10666759.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值