python - 如何从受 __init__ 参数限制的对象实例中删除方法?
问题描述
我想编写一个类,在访问特定方法的情况下删除访问或抛出错误,并且此行为应受类实例化时设置的变量的限制。
所以在代码中我想要这样的东西:
class NewClass:
def __init__(self, has_non_available_method):
self.has_non_available_method = has_non_available_method
def some_method(self):
if self.has_non_available_method:
raise SomeError()
这很好,但是,如果我想要几个这样的方法,那么我必须将这两行复制粘贴到每个方法中。哪个“看起来不是很复杂”,我想知道是否存在“更好”/ DRY 方法。
我考虑过使用装饰器,但装饰器在类执行时执行,因此它们似乎不适合此任务,因为has_non_available_method
此时不会设置属性(在此示例中)。
解决方案
一个装饰器是完美的。
def checkavail(func):
def wrapper(self, *args, **kwargs):
if self.has_non_available_method:
raise SomeError()
func(self, *args, **kwargs)
return wrapper
class NewClass:
def __init__(self, has_non_available_method):
self.has_non_available_method = has_non_available_method
@checkavail
def some_method(self):
# do stuff
推荐阅读
- r - 有什么方法可以在ggplot中使用计数统计来注释多个箱线图?
- docker - 有没有办法使用 conda 或通过 tar 文件安装 Boto3?
- angular - 在 Nginx Ingress AKS 上设置 Angular 应用程序
- if-statement - 基于另一个字段在 Tableau 中的排名
- mysql - 如何在SQL中检查一个孩子的所有父记录的列值
- javascript - 格式良好的 JSON 文件
- css - 改变整个页面的颜色
- python - 程序不允许选择的数字输出运行
- windows - UAC 提示期间的鼠标控制 (SendInput)
- c# - 如何在 WPF 运行时更改 Listview 中的图像?