📅  最后修改于: 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()。
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方法采用三个参数object,name和default(可选)。
class Employee:
salary = 25000
company_name= "芒果文档"
employee = Employee()
print('工资:', getattr(employee, "salary"))
print('工资:', employee.salary)
输出:
工资: 25000
工资: 25000