python的反射机制(自醒机制)
1. 反射的简介
1.1. 什么是反射
反射的英文单词“reflection”, 在很多动态语言中都有反射机制(reflection mechanism),python也不例外。
为什么强调动态语言呢? 因为动态语言很多允许我们动态的新增、修改、删除类(或者对象)的方法与属性。
这无疑是一个非常强大的功能!
1.2. 举例说明
1.2.1. 原来的代码
我们先看一个代码:
class Person:
type = "mammal"
def __init__(self, name):
self.name = name
def say_hi(self):
print('Hello, my name is', self.name)
@staticmethod
def feed():
print("Three times per day.")
@classmethod
def sleep(cls):
print("8 hours!")
p = Person('phoenix') # 实例化一个Person对象,实例化后的对象名称为p
p.say_hi() # 对实例化后的对象调用实例方法
print(f"{
p.name = }") # 对实例化后的对象调用实例属性
输出的结果:
Hello, my name is phoenix
p.name = 'phoenix'
这个输出结果非常简单,稍微有点面向对象编程经验的人都可以看懂,所以说什么。
现在我遇到一个问题: 我不知道某一个类(假设就是上面例子中的Person
)是不是有某一个方法(假设就是上面例子中的say_hi()
),我应该怎么调用呢?
你可能觉得这有点抬杠了,会觉得:
- 类不是自己写的吗,即使不是自己写的那也应该是继承的,应该知道它有哪些方法啊
- 这个类我都已经实例化了,怎么还不知道有没有这个方法呢?
其实上面的疑惑主要的原因是没理解动态语言的概念, 即然是动态的,那么方法、属性就有可能发生变化(也就有能增加或者被删除)。