【发布时间】:2021-07-17 19:07:14
【问题描述】:
我有以下代码 sn-p,它有两个方法 func_norule() 和 func_with_rule()。 func_with_rule() 方法被 @rule 修饰,而 func_norule() 没有任何修饰符。
当我使用 getattr 函数时 fn = getattr(self, 'func_norule') 返回函数 fn = getattr(self, 'func_with_rule') 返回 None .
为什么在使用装饰器和不使用装饰器时会有不同的行为? 有什么办法解决这个问题?
class Student():
def __init__(self, name, roll_no):
self.name = name
self.roll_no = roll_no
## Decorator function to decorate all the rules function
def rule(func):
print(func.__name__)
def func_norule(self):
#This method works with getattr
print("func_norule:" + self.name)
@rule
def func_with_rule(self):
#This method returns None with getattr
print("func_with_rule:" + self.name)
def myFunc2(self):
fn = getattr(self, 'func_norule')
fn()
fn = getattr(self, 'func_with_rule')
fn()
student = Student('myName', 8)
student.myFunc2()
【问题讨论】:
-
装饰器根本不是这样工作的。它应该返回一个函数(新的、经过修饰的函数)来替换未修饰的函数。你的只是没有明确返回,所以它返回
None。