gpt4 book ai didi

Python:如果某个属性为真,则允许调用某些方法

转载 作者:太空宇宙 更新时间:2023-11-04 01:46:57 27 4
gpt4 key购买 nike

我试图防止类中某些方法的使用被滥用。我认为守卫装饰器可以按如下方式工作。

例如,我们有类 Hello。它有一个属性 allowed 和两个方法 allowed_functiondisallowed_function。守卫装饰器将管理可以调用​​和不能调用的函数。

class Hello:
def __init__(self):
self.allowed = True

def guard_func(self):
return(self.allowed)

@guard(guard_func)
def allowed_function(self):
print "I'm allowed!"

@guard(not guard_func)
def disallowed_function(self):
print "I'm not allowed!"

我应该如何在 Python 中处理这个问题?

最佳答案

这是 Python 3 的 guard 实现(看起来您可能正在使用 2;我强烈建议升级)。

import functools


class NotAllowed(Exception):
pass


def guard(condition):
def decorator(func):
@functools.wraps(func)
def wrapper(self, *args, **kwargs):
if not condition(self):
raise NotAllowed(f"Not allowed to call {func}")
return func(self, *args, **kwargs)

return wrapper

return decorator


class Hello:
def __init__(self):
self.allowed = True

def guard_func(self):
return self.allowed

@guard(guard_func)
def allowed_function(self):
print("I'm allowed!")

@guard(lambda self: not self.guard_func())
def disallowed_function(self):
print("I'm not allowed!")


h = Hello()

h.allowed_function() # will print the message
h.disallowed_function() # will raise a `NotAllowed` exception

基本上,您在这里需要两个级别的间接寻址。你必须写一个返回实际装饰器函数的函数,这样你就可以根据你在实际使用装饰器时传入的条件函数来参数化它。您还需要注意 self 的传递方式。


functools.wraps 不是必需的,但强烈建议:https://docs.python.org/3.8/library/functools.html#functools.wraps

上面的一切都应该像在 Python 2 上宣传的那样工作,你只需要用字符串格式替换 f-string。

关于Python:如果某个属性为真,则允许调用某些方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58895784/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com