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


    # 面向对象的进阶
    # 其他常用模块
    # 作业 考试题
    # 网络编程 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)
  • 相关阅读:
    [日常摸鱼]UVA393 The Doors 简单计算几何+最短路
    [日常摸鱼]bzoj3122 [Sdoi]2013 随机数生成器
    [日常摸鱼]积性函数求和——杜教筛
    [OI笔记]NOIP2017前(退役前)模拟赛的总结
    [日常摸鱼]poj2417 DiscreteLoggingBSGS算法
    [日常摸鱼]UVA11424&11426 GCD Extreme
    [日常摸鱼]JSOI2008最大数
    [日常摸鱼]HDU1724 Ellipse自适应Simpson法
    原码、补码、反码的作用和区别
    Fibonacci序列or兔子序列
  • 原文地址:https://www.cnblogs.com/mys6/p/10666759.html
Copyright © 2020-2023  润新知