你能解释一下 Python 中的装饰器是啥吗? [关闭]

Posted

技术标签:

【中文标题】你能解释一下 Python 中的装饰器是啥吗? [关闭]【英文标题】:Can you explain what a decorator is in Python? [closed]你能解释一下 Python 中的装饰器是什么吗? [关闭] 【发布时间】:2016-11-07 03:25:20 【问题描述】:

我正在学习 Python OOP,并谈到了装饰器这一主题,但我用于学习的材料并未深入介绍它。 我发布示例代码:

class Duck:
    def __init__(self, **kwargs):
        self.properties = kwargs

    def quack(self):
        print("Quaaack!")

    def walk(self):
        print("Walk like a duck.")

    def get_properties(self):
        return self.properties

    def get_property(self, key):
        return self.properties.get(key, None)

    @property
    def color(self):
        return self.properties.get("color", None)

    @color.setter
    def color(self, c):
        self.properties["color"] = c

    @color.deleter
    def color(self):
        del self.properties["color"]

def main():
    donald = Duck()
    donald.color = "blue"
    print(donald.color)

if __name__ == "__main__": main()

你能帮我理解装饰器的重要性吗? 能否用简单的语言解释一下装饰器的概念?

【问题讨论】:

网上有很多关于装饰器的文章。例如。 thecodeship.com/patterns/guide-to-python-function-decorators docs.python.org/3/glossary.html#term-decorator, docs.python.org/3/reference/compound_stmts.html#function Python - Decorators的可能重复 我只需要有人用简单的话解释一下装饰器是什么。 (不仅仅是注释代码)。我不明白为什么有人对这个问题投了反对票。我查看了一个可能重复的问题,但在这些答案中没有人通常解释什么是装饰器,所以我的问题实际上是独一无二的。 在此处查看第二个答案 - ***.com/questions/739654/… 我同意,虽然基本上是基本的,但这个问题没有直接重复的问题 - 至少在简单搜索中没有出现过 【参考方案1】:

关于上面的代码,让我写一些我可以简单说的话,

通常说装饰器是

“函数装饰器只是现有函数的包装器”

装饰器总是包装另一个函数,更不用说装饰器本身就是一个函数

在上面的代码中,您正在设置、获取、删除一个属性/正式地是“鸭子”的一个属性,它是一种颜色。

装饰器总是以“@”开头。 @property 是一个预定义的装饰器函数,用于获取类的 getter、setter 和 del 函数

    @property #getter
    def color(self):
        return self.properties.get("color", None)

    @color.setter #setter
    def color(self, c):
        self.properties["color"] = c

    @color.deleter #del
    def color(self):
        del self.properties["color"]

您所做的只是将函数(getter、setter、del)作为参数传递给@property

如果你写了你的 main 它会像

if __name__ == "__main__": main()  
    donald = Duck() //creating object
    donald.color = "blue" //call the setter method, look its more intuitive!!  (you don't using the donald.color("blue") syntax)
    print(donald.color)//getter

我们也可以拥有自己的装饰器,我强烈建议您阅读建议的链接以了解其各种用途和优势

【讨论】:

以上是关于你能解释一下 Python 中的装饰器是啥吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

python装饰器是啥意思

python之装饰器

将函数转换为字段的装饰器是啥?

有人可以解释这个指针在这里指的是啥吗?

有人可以解释一下这个例子中 CSS 中的“溢出”到底对背景做了啥吗? [复制]

有人可以解释在 C++ 中通过指针传递和通过引用传递的目的是啥吗?