大漠星空 發表於 2025-6-8 18:03:00

python中可变参数与装饰器的例子

<h2 id="python的可变参数">python的可变参数</h2>
<h3 id="方法定义">方法定义</h3>
<pre><code class="language-python">#*args是可以传list类型的可变参数,**kwargs是可以传dict的可变参数
def wrapper(*args, **kwargs):
</code></pre>
<h3 id="使用示例">使用示例</h3>
<pre><code class="language-python">def foo(*args, **kwargs):
    print 'args = ', args
    print 'kwargs = ', kwargs
    print '---------------------------------------'

if __name__ == '__main__':
    foo(1,2,3,4)
    foo(a=1,b=2,c=3)
    foo(1,2,3,4, a=1,b=2,c=3)
    foo('a', 1, None, a=1, b='2', c=3)
</code></pre>
<p>输出结果:</p>
<pre><code class="language-shell">输出结果如下:
args =(1, 2, 3, 4)
kwargs ={}
---------------------------------------
args =()
kwargs ={'a': 1, 'c': 3, 'b': 2}
---------------------------------------
args =(1, 2, 3, 4)
kwargs ={'a': 1, 'c': 3, 'b': 2}
---------------------------------------
args =('a', 1, None)
kwargs ={'a': 1, 'c': 3, 'b': '2'}
</code></pre>
<p>例子来源《Python tips: 什么是*args和**kwargs? - MK2 - 博客园 (cnblogs.com)》</p>
<br>
<h2 id="装饰器例子">装饰器例子</h2>
<p>搭配装饰器使用,用来判断是否为空</p>
<pre><code class="language-python">#定义一个函数,并进行wrapper一层,用来当作装饰器
def leftTopUICheck(func):
        def wrapper(*args, **kwargs):
                if hasattr(xxglobal.rds, 'MainPartLeftTopUI'):
                        return func(*args, **kwargs)
                else:
                        return
        return wrapper

@leftTopUICheck
def setLeftTopPictureFrameRes(filename):
        xxglobal.rds.MainPartLeftTopUI.setPictureFrameRes(filename)
</code></pre>
<h3 id="定义">定义</h3>
<p>@符号是一个语法糖,当执行函数时,会把当前函数传入到@指向的函数中执行。</p>
<br>
<h2 id="装饰器用途">装饰器用途</h2>
<p>结合项目代码来看,目前我们大多是用在前置检查,且会把装饰器函数定义在sys.path内的文件中,避免每次使用都要import。如果装饰器的函数实现在同一个文件中则不需要import。</p>
<br>
<h2 id="装饰器的优缺点">装饰器的优缺点</h2>
<p>装饰器是 Python 中的一种强大工具,它们有许多优点,但也有一些潜在的缺点。</p>
<p>优点:</p>
<ol>
<li>
<p><strong>代码重用</strong>:装饰器允许你在多个函数或方法中重用代码。你可以创建一个装饰器来执行一些通用的任务,然后将它应用到任何需要这些任务的函数上。</p>
</li>
<li>
<p><strong>代码组织</strong>:装饰器可以帮助你更好地组织你的代码。你可以将相关的代码放在同一个装饰器中,这样可以使你的代码更易于理解和维护。</p>
</li>
<li>
<p><strong>扩展性</strong>:装饰器允许你在不修改原始函数代码的情况下添加新的功能。这使得装饰器成为一种强大的工具,用于扩展和修改现有的代码。</p>
</li>
</ol>
<p>缺点:</p>
<ol>
<li>
<p><strong>复杂性</strong>:装饰器可能会增加代码的复杂性,特别是对于不熟悉装饰器的开发者来说。装饰器的行为可能会让人困惑,特别是当装饰器链或嵌套装饰器被使用时。</p>
</li>
<li>
<p><strong>调试难度</strong>:由于装饰器修改了函数的行为,所以它可能会使得调试变得更加困难。错误可能会隐藏在装饰器中,而不是在你的函数中。</p>
</li>
<li>
<p><strong>性能开销</strong>:装饰器可能会引入额外的性能开销,因为它们在函数调用之前和之后添加了额外的操作。</p>
</li>
</ol>
<p>总的来说,装饰器是一种非常有用的工具,但是需要谨慎使用。在使用装饰器时,你应该确保你完全理解了它们的行为,并且考虑到了它们可能带来的潜在问题。</p>
<br>
<h3 id="装饰器导入就会执行">装饰器导入就会执行</h3>
<pre><code class="language-python">def my_decorator(func):
    print("Decorator is being executed!")
    def wrapper():
      print("Function is being executed!")
      func()
    return wrapper

@my_decorator
def my_function():
    print("Hello, world!")

# 当import这个module时就会执行输出:
# Decorator is being executed!
</code></pre>
<h2 id="装饰器与c">装饰器与C#</h2>
<p>在C#中有Attribute,写法上和装饰器一样都是在方法名的上行加上,它也可以达到装饰器的一些功能。</p>
<pre><code class="language-c#">//MenuItem 定义:
public MenuItem(string itemName, bool isValidateFunction)
   
//用法

public static void openXXFunc()
{

}
</code></pre>
<br>
<p>但是如果要实现装饰器完整的前置检查,在C#中我一般是传入一个(Action callback)来处理。</p>
<pre><code class="language-c#">void Check(Action callback){
    if (not 前置检查) return;
    callback.Invoke();
}
</code></pre><br><br>
来源:https://www.cnblogs.com/zhaoqingqing/p/18919606
頁: [1]
查看完整版本: python中可变参数与装饰器的例子