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()。
- type 和 isinstance – 参考这里
- 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
- Dir : dir() 方法尝试返回对象的有效属性列表。 dir() 尝试返回对象的有效属性列表。
- 如果对象有 __dir__() 方法,该方法将被调用并且必须返回属性列表。
- 如果对象没有 __dir()__ 方法,此方法会尝试从 __dict__ 属性(如果已定义)和类型对象中查找信息。在这种情况下,从 dir() 返回的列表可能不完整。
例子:
number = [1,2,3]
print(dir(number))
characters = ["a", "b"]
print(dir(number))
输出:
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. 维基书