zoukankan      html  css  js  c++  java
  • Python学习笔记-Day21-反射、__str__、__repr__

    内容大纲

    一、反射(getattr、hasattr、setattr、delattr)

    二、__str__和__repr__

    一、反射

    1、什么是反射:反射式通过字符串类型的变量名来获取变量的值

    2、为什么使用反射:input输入的都是字符串类型,文件读取的都是字符串类型、网络传输的都是字符串类型

    3、方法解析:

      ① getattr:getattr(变量的空间名,字符串类型的变量名),# 相当于变量的空间名.变量名,即对象名.属性。变量名可以是属性也可以是方法,如果要执行方法的话,在后面加上()。

      ② hasattr:用来判断该命名空间中是否有这个变量名,hasattr(变量的空间名,字符串类型的变量名)。

      ③ setattr:用来改变变量的值,有三个参数,setattr(变量的空间,变量名,更改后的变量名),通常方法不会被改变

      ④ delattr:用来删除变量,delattr(变量的空间,字符串类型的变量名)

    4、反射的用处:

      ① 反射类中的变量:静态属性、类方法、静态方法

    class Foo:
        school = 'oldboy'
        country = 'China'
        language = 'Chinese'
        @classmethod
        def class_method(cls):
            print(cls.school)
        @staticmethod
        def static_method():
            print('instatic_method')
        def wahaha(self):
            print('wahahah')
    
    # 没有反射前:需要每个都进行判断
    # inp=input('>>>')
    # ifinp=='school':
    # print(Foo.school)
    # ifinp=='country':
    # print(Foo.country)
    # 有反射后:不需要每个都判断,直接执行就行
    while True:
        inp = input('>>>')
        if hasattr(Foo, inp):
            print(getattr(Foo, inp))
    getattr(Foo, 'school')  # 相当于Foo.school    反射类中的属性
    getattr(Foo, 'class_method')()  # 相当于Foo.class_method()   反射类中的类方法
    getattr(Foo, 'static_method')  # 相当于Foo.static_method()   反射类中的静态方法
    print(hasattr(Foo, 'wahaha'))  # True   

      ② 反射对象中的变量:属性,普通方法

    class Foo:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    def eating(self):
        print('%siseating' % self.name)
    ming = Foo('xiaoming', 23)
    getattr(ming, 'eating')()  # xiaomingiseating普通方法
    print(getattr(ming, 'name'))  # 对象属性

      ③ 反射模块中的变量:

    import os  # os就是一个模块
    os.rename('123', '123.bak')
    getattr(os, 'rename')('123.bak', '123')

      ④ 反射本文件中的变量:import sys

                 空间名是  sys.modules['__main__']  或sys.modules[__name__]

    a = 1
    b = 2
    def file_func():
        print('infunc')
    import sys
    print(sys.modules['__main__'])  # sys.module['__main__']是本文件的命名空间
    print(sys.modules['__main__'].a)  # 打印出1
    sys.modules['__main__'].file_func()  # infunc
    getattr(sys.modules[__name__], 'file_func')()  # infunc
  • 相关阅读:
    Oracle的建表约束
    Sql的增删改操作
    关联查询之92语法和99语法
    日常编程练习(三)
    日常编程练习(二)
    日常编程练习(一)
    C++ 赋值运算符函数
    内存管理
    进程同步——经典的同步问题
    I/O 阻塞与非阻塞,同步与异步
  • 原文地址:https://www.cnblogs.com/tian-tian/p/9569403.html
Copyright © 2011-2022 走看看