📜  Python中的反射

📅  最后修改于: 2022-05-13 01:55:34.383000             🧑  作者: Mango

Python中的反射

反射是指代码能够检查可能作为参数传递给函数的对象的属性的能力。例如,如果我们编写 type(obj),那么Python将返回一个表示 obj 类型的对象。

使用反射,我们可以编写一个递归反向函数,该函数适用于字符串、列表和任何其他支持切片和连接的序列。如果 obj 是对字符串的引用,那么Python将返回 str 类型的对象。此外,如果我们编写字符串。换句话说,写 str() 和写“”是一样的。同样,写 list() 和写 [] 是一样的。

# Python program to illustrate reflection 
def reverse(sequence): 
    sequence_type = type(sequence) 
    empty_sequence = sequence_type() 
      
    if sequence == empty_sequence: 
        return empty_sequence 
      
    rest = reverse(sequence[1:]) 
    first_sequence = sequence[0:1] 
      
    # Combine the result 
    final_result = rest + first_sequence
      
    return final_result 
  
# Driver code 
print(reverse([10, 20, 30, 40])) 
print(reverse("GeeksForGeeks")) 

输出:

[40, 30, 20, 10]
skeeGroFskeeG

反射功能

启用反射的函数包括 type()、isinstance()、callable()、dir() 和 getattr()。

  1. type 和 isinstance – 参考这里
  2. Callable() :可调用的意思是任何可以被调用的东西。对于一个对象,判断它是否可以被调用。可以通过提供 __call__() 方法使类成为可调用的。如果传递的对象看起来是可调用的,则 callable() 方法返回 True。如果不是,则返回 False。
    例子:
    x = 5
    
    def testFunction():
      print("Test")
       
    y = testFunction
    
    if (callable(x)):
        print("x is callable")
    else:
        print("x is not callable")
    
    if (callable(y)):
        print("y is callable")
    else:
        print("y is not callable")
    

    输出:

    x is not callable
    y is callable

    在 OOP 中使用时可调用

    class Foo1:
      def __call__(self):
        print('Print Something')
    
    print(callable(Foo1))
    

    输出:

    True
  3. Dir : dir() 方法尝试返回对象的有效属性列表。 dir() 尝试返回对象的有效属性列表。
        如果对象有 __dir__() 方法,该方法将被调用并且必须返回属性列表。
        如果对象没有 __dir()__ 方法,此方法会尝试从 __dict__ 属性(如果已定义)和类型对象中查找信息。在这种情况下,从 dir() 返回的列表可能不完整。

    例子:

    number = [1,2,3]
    print(dir(number))
    
    characters = ["a", "b"]
    print(dir(number))

    输出:

  4. Getattr : getattr() 方法返回对象的命名属性的值。如果未找到,则返回提供给函数的默认值。getattr 方法采用三个参数objectnamedefault(可选)。
    class Employee:
        salary = 25000
        company_name= "geeksforgeeks"
    
    employee = Employee()
    print('The salary is:', getattr(employee, "salary"))
    print('The salary is:', employee.salary)

    输出:

    The salary is: 25000
    The salary is: 25000

    参考链接
    2. docs_python
    3. 维基书