📜  Python中的反射

📅  最后修改于: 2020-04-08 01:00:27             🧑  作者: Mango

反射是指代码能够检查可能作为参数传递给函数的对象属性的能力。例如,如果我们编写type(obj),则Python将返回一个表示obj类型的对象。
使用反射,我们可以编写一个递归反向函数,该函数可用于字符串,列表以及支持切片和连接的任何其他序列。如果obj是对字符串的引用,则Python将返回str类型对象。此外,如果我们编写str(),则会得到一个字符串,它是空字符串。换句话说,写str()与写“”相同。同样,编写list()与编写[]是相同的事情。

# Python展示反射
def reverse(seq):
    SeqType = type(seq)
    emptySeq = SeqType()
    if seq == emptySeq:
        return emptySeq
    restrev = reverse(seq[1:])
    first = seq[0:1]
    # 结合结果
    result = restrev + first
    return result
# Driver code
print(reverse([1, 2, 3, 4]))
print(reverse("HELLO"))

输出:

[4,3,2,1]
OLLEH

启用反射的函数

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

  1. 类型和对象。
  2. Callable():Callable意味着可以调用的任何东西。对于对象,确定是否可以调用它。通过提供__call __()方法可以使一个类可调用。如果传递的对象显示为可调用,则callable()方法将返回True。如果不是,则返回False。
    例子:
    x = 5
    def testFunction():
      print("Test")
    y = testFunction
    if (callable(x)):
        print("x 是 callable")
    else:
        print("x 不是 callable")
    if (callable(y)):
        print("y 是 callable")
    else:
        print("y 不是 callable")

    输出:

    x 不是 callable
    y 是 callable

    在OOP中使用时可调用

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

    输出:

    True

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

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

    输出:


    Getattr: getattr()方法返回对象的命名属性的值。如果未找到,它将返回提供给函数的默认值。getattr方法采用三个参数objectnamedefault(可选)。 

    class Employee:
        salary = 25000
        company_name= "芒果文档"
    employee = Employee()
    print('工资:', getattr(employee, "salary"))
    print('工资:', employee.salary)

    输出: 

    工资: 25000
    工资: 25000