当前位置:首页 » 编程语言 » python修饰函数

python修饰函数

发布时间: 2023-10-03 15:53:20

python 中 @ 是什么意思

修饰符,比如说

class A:

@staticmethod

def m(self):

pass

就相当于

class A:

def m(self):

pass

m = staticmethod(m)

其实就是一调用一个函数参数为下行的变量,并且替换它

(1)python修饰函数扩展阅读:

函数修饰符

@用做函数的修饰符,可以在模块或者类的定义层内对函数进行修饰,出现在函数定义的前一行,不允许和函数定义在同一行。

一个修饰符就是一个函数,它将被修饰的函数作为参数,并返回修饰后的同名函数或其他可调用的东西。

在Python的函数中偶尔会看到函数定义的上一行有@functionName的修饰,当解释器读到@这样的修饰符的时候会优先解除@后的内容,直接就把@的下一行的函数或者类作为@后边函数的参数,然后将返回值赋给下一个修饰的函数对象。

❷ python函数里定义的类

#Python 2.5
#这个可以用修饰器来完成
#但是一般不会限制参数类型
#给你个思路:

def argfilter(*types):
def deco(func): #这是修饰器
def newfunc(*args): #新的函数
if len(types)==len(args):
correct = True
for i in range(len(args)):
if not isinstance(args[i], types[i]): #判断类型
correct = False
if correct:
return func(*args) #返回原函数值
else:
raise TypeError
else:
raise TypeError
return newfunc #由修饰器返回新的函数
return deco #返回作为修饰器的函数

@argfilter(int, str) #指定参数类型
def func(i, s): #定义被修饰的函数
print i, s

#之后你想限制类型的话, 就这样:
#@argfilter(第一个参数的类名, 第二个参数的类名, ..., 第N个参数的类名)
#def yourfunc(第一个参数, 第一个参数, ..., 第N个参数):
# ...
#
#相当于:
#def yourfunc(第一个参数, 第一个参数, ..., 第N个参数):
# ...
#yourfunc = argfilter(第一个参数的类名, 第二个参数的类名, ..., 第N个参数的类名)(yourfunc)

❸ Python 中的 classmethod 和 staticmethod 有什么具体用途

classmethod:类方法
staticmethod:静态方法

在python中,静态方法和类方法都是可以通过类对象和类对象实例访问。但是区别是:

@classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。

普通对象方法至少需要一个self参数,代表类对象实例

类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。

静态方法则没有,它基本上跟一个全局函数相同,一般来说用的很少

Example 1:

>>>classa():
@staticmethod
defstaticm():
print'static'
defnormalm(self):
print'nomarl',self
@classmethod
defclassm(cls):
print'class',cls


>>>a1=a()
>>>a1.normalm()
nomarl<__main__.ainstanceat0x84dddec>
>>>a1.staticm()
static
>>>a1.classm()
class__main__.a
>>>type(a)
<type'classobj'>
>>>type(a1)
<type'instance'>


Example 2:

classA(object):
@classmethod
defcm(cls):
print'类方法cm(cls)调用者:',cls.__name__
@staticmethod
defsm():
print'静态方法sm()被调用'
classB(A):
pass
A.cm()
B.cm()
A.sm()
B.sm()
输出:
类方法cm(cls)调用者:A
类方法cm(cls)调用者:B
静态方法sm()被调用
静态方法sm()被调用


@classmethod与@staticmethod的应用实例

#!/usr/bin/envpython
#-*-coding:utf-8-*-
classTClassStatic(object):
obj_num=0
def__init__(self,data):
self.data=data
TClassStatic.obj_num+=1
defprintself(self):
print("self.data:",self.data)
@staticmethod
defsmethod():
print("thenumberofobjis:",TClassStatic.obj_num)
@classmethod
defcmethod(cls):
print("cmethod:",cls.obj_num)
cls.smethod()
defmain():
objA=TClassStatic(10)
objB=TClassStatic(12)
objB.printself()
objA.smethod()
objB.cmethod()
print("------------------------------")
TClassStatic.smethod()
TClassStatic.cmethod()
if__name__=="__main__":
main()

输出结果如下:

('self.data:',12)
('thenumberofobjis:',2)
('cmethod:',2)
('thenumberofobjis:',2)
------------------------------
('thenumberofobjis:',2)
('cmethod:',2)
('thenumberofobjis:',2)

❹ python所有内置函数的定义详解

1、定义函数

函数是可重用的程序。本书中已经使用了许多内建函数,如len()函数和range()函数,但是还没自定义过函数。定义函数的语法格式如下:

def 函数名(参数):

函数体

定义函数的规则如下:

①关键字def用来定义一个函数,它是define的缩写。

②函数名是函数的唯一标识,函数名的命名规则遵循标识符的命名规则。

③函数名后面一定要紧跟着一个括号,括号内的参数是可选的,括号后面要有冒号。

④函数体(statement)为一个或一组Python语句,注意要有缩进。

⑤函数体的第一行可以有文档字符串,用于描述函数的功能,用三引号括起来。

按照定义规则,可以定义第一个函数了:

  • >>>defhello_world():

  • ...print('Hello,world!')#注意函数体要有缩进

  • ...

  • >>>hello_world()

  • Hello,world!

  • 这个函数不带任何参数,它的功能是打印出“Hello,world!”。最后一行代码hello_world()是调用函数,即让Python执行函数的代码。

    2、全局变量和局部变量

    全局变量是定义在所有函数外的变量。例如,定义一个全局变量a,分别在函数test1()和test2()使用变量a:

  • >>>a=100#全局变量

  • >>>deftest1():

  • ...print(a)

  • ...

  • >>>deftest2():

  • ...print(a)

  • ...

  • >>>test1()

  • 100

  • >>>test2()

  • 100

  • 定义了全局变量a之后,在函数test1()和test2()内都可以使用变量a,由此可知,全局变量的作用范围是全局。

    局部变量是在函数内定义的变量,除了用关键字global修饰的变量以外。例如,在函数test1()内定义一个局部变量a,分别在函数外和另一个函数test2()内使用变量a:

  • >>>deftest1():

  • ...a=100#局部变量

  • ...print(a)

  • ...

  • >>>deftest2():

  • ...print(a)

  • ...

  • >>>test1()

  • 100

  • >>>print(a)

  • Traceback(mostrecentcalllast):

  • File"<stdin>",line1,in<mole>

  • NameError:name'a'isnotdefined

  • >>>test2()

  • Traceback(mostrecentcalllast):

  • File"<stdin>",line1,in<mole>

  • File"<stdin>",line2,intest2

  • NameError:name'a'isnotdefined

  • Python解释器提示出错了。由于局部变量a定义在函数test1()内,因此,在函数test1()内可以使用变量a,但是在函数外或者另一个函数test2()内使用变量a,都会报错,由此可见,局部变量的作用范围是定义它的函数内部。

    一般情况下,在函数内声明的变量都是局部变量,但是采用关键字global修饰的变量却是全局变量:

  • >>>deftest1():

  • ...globala#全局变量

  • ...a=100

  • ...print(a)

  • ...

  • >>>deftest2():

  • ...print(a)

  • ...

  • >>>test1()

  • 100

  • >>>print(a)

  • 100

  • >>>test2()

  • 100

  • 这个程序与上个程序相比,只是在函数test1()中多了一行代码“global a”,程序便可以正确运行了。在函数test1()中,采用关键字global修饰了变量a之后,变量a就变成了全局变量,不仅可以在该函数内使用,还可以在函数外或者其他函数内使用。

    如果在某个函数内局部变量与全局变量同名,那么在该函数中局部变量会覆盖全局变量:

  • >>>a=100#全局变量

  • >>>deftest1():

  • ...a=200#同名局部变量

  • ...print(a)

  • ...

  • >>>deftest2():

  • ...print(a)

  • ...

  • >>>test1()

  • 200

  • >>>test2()

  • 100

  • 由于在函数test1()中定义了一个与全局变量同名的局部变量a,因此,在函数test1()中全局变量a的值被局部变量覆盖了,但是在函数test2()中全局变量a的值没有被覆盖。

    综上所述,在Python中,全局变量保存的数据供整个脚本文件使用;而局部变量只用于临时保存数据,变量仅供局部代码块使用。

❺ python的高级特征及用法介绍

【导读】Python 是一种美丽的语言,它简单易用却非常强大。任何编程语言的高级特征通常都是通过大量的使用经验才发现的。比如你在编写一个复杂的项目,并在
stackoverflow 上寻找某个问题的答案,然后你突然发现了一个非常优雅的解决方案,它使用了你从不知道的 Python
功能,下面就给大家进行python的高级特征及用法介绍。

1、Map 函数

Map() 是一种内置的 Python
函数,它可以将函数应用于各种数据结构中的元素,如列表或字典。对于这种运算来说,这是一种非常干净而且可读的执行方式。

2、Lambda 函数

Lambda 函数是一种比较小的匿名函数——匿名是指它实际上没有函数名。

Python 函数通常使用 def a_function_name() 样式来定义,但对于 lambda 函数,我们根本没为它命名。这是因为 lambda
函数的功能是执行某种简单的表达式或运算,而无需完全定义函数。

lambda 函数可以使用任意数量的参数,但表达式只能有一个。

3、Generator 函数

Generator 函数是一个类似迭代器的函数,即它也可以用在 for 循环语句中。这大大简化了你的代码,而且相比简单的 for
循环,它节省了很多内存。

4、Filter 函数

filter 内置函数与 map 函数非常相似,它也将函数应用于序列结构(列表、元组、字典)。二者的关键区别在于 filter() 将只返回应用函数返回
True 的元素。

5、Itertools 模块

Python 的 Itertools 模块是处理迭代器的工具集合。迭代器是一种可以在 for 循环语句(包括列表、元组和字典)中使用的数据类型。

使用 Itertools 模块中的函数让你可以执行很多迭代器操作,这些操作通常需要多行函数和复杂的列表理解。

以上就是python的高级特征及用法介绍,希望对于大家的python学习能有所帮助,想要学习更多的python高级技能,希望大家持续关注!

热点内容
黑苹果idea编译慢 发布:2025-02-01 13:45:30 浏览:548
c和linux 发布:2025-02-01 13:39:38 浏览:175
android实现列表 发布:2025-02-01 13:38:06 浏览:102
安卓手机为什么会出现横条 发布:2025-02-01 13:33:38 浏览:625
jqueryajax提交文件上传 发布:2025-02-01 13:32:03 浏览:689
没连上wifi如何修改wifi密码 发布:2025-02-01 13:20:42 浏览:758
绝对赛车3安卓在哪里下载 发布:2025-02-01 12:42:30 浏览:718
mysql修改数据库字符 发布:2025-02-01 12:37:52 浏览:570
阿里云服务器出厂密码是多少 发布:2025-02-01 12:35:43 浏览:668
手机传文件服务器和ip地址 发布:2025-02-01 12:15:01 浏览:660