Python中的抽象
判断函数是否可调用
python2.x版本通过
callable(x)
3.x版本使用表达式
hasattr(func,__call__)
函数的参数
关键字参数和默认值
def hello_1(greeting,name):print greeting,namehello_1("hello","Saint")
定义了一个hello函数,它有两个参数,这里参数的顺序很重要。但是如果参数很多的情况下,难免无法保证全部输对,这时候可以提供参数的名字:
hello_1(name="Saint",greeting="nice to meet you,")
如上,只要参数名称提供对了,可以不用考虑顺序。
关键参数还可以设置默认值:
def hello_2(greeting="hello", name="jack"):print greeting, namehello_2()
hello_2("nice to meet you")
hello_2(name="saint")
输出:
hello jack
nice to meet you jack
hello saint
上面的3种用法都是可以的。
收集参数
可以传入任意数量的参数:
def print_params(*params):print paramsprint_params("Test") #('Test',)
print_params(1,2,3) #(1, 2, 3)
这个函数只定义了一参数,前面加了个*
号,类似于Java中的...
。*
号的作用是收集参数,从输出可以看出python是用元组来保存这些参数的。
还有一个能处理关键字参数用法:
def print_params_2(**params):print paramsprint_params_2(x=1,y=2,z=3) #{'y': 2, 'x': 1, 'z': 3}
它打印的是字典而不是元组
收集参数的逆过程
所谓逆过程是指,不是在方法参数定义中使用*
号,而是在调用方法的入参中使用。
def add(x,y):return x+yparams = (1,2)
print add(*params) #3
这个add方法需要两个参数,可以在调用时在元组params左边添加一个*
号。实现将元组内的两个元素相加。
可以使用同样的技术来处理字典-使用**
运算符。
可以这样使用
params = {'name':'jack','greeting':'nice to meet you'}
hello_2(**params) #nice to meet you jack
*
号对应元组,**
号对应字典
函数式编程
函数可以分配给变量、作为参数传递以及从其他函数返回。
In [5]: import functools
In [8]: def func(x): ...: return x.isalnum() # 检测字符串是否由字母和数字组成...:
In [9]: seq = ['foo','x41','?!','***']
In [10]: filter(func,seq)
Out[10]: <filter at 0x7fc99d586b70>
In [12]: list(filter(func,seq))
Out[12]: ['foo', 'x41']
(python3)
这里函数func
作为参数传递到了filter()
函数。
类
创建自己的类
__metaclass__ = type #使用新式类class Person:def setName(self,name):self.name = namedef getName(self):return self.namedef greet(self):print "Hello,world! I'm %s." % self.name
注意,这里和Java中不同的是,name
属性之前没有定义self.name = name
将参数中的name
赋值到属性name
,保持着python中属性不用定义的特性。
使用方法:
foo = Person()
bar = Person()
foo.setName("Saint")
bar.setName("Jack")foo.greet()#Hello,world! I'm Saint.
bar.greet()#Hello,world! I'm Jack.
在setName和greet函数里面有一个self,这里的self类似于Java中的this,不过Java中的this是隐式的(即不需要在函数参数中写明)。
还可以通过.
号来访问变量:
foo.name = "Mikey"
foo.greet()
相当于name是公有域。
函数和方法
方法和函数的区别是self参数。方法(或称为绑定方法)将它们的第一个参数绑定到所属的实例上。
python中的方法一般指定义在对象中的method
私有化
Python不直接支持私有方式,但可以通过一些小技巧达到私有属性的效果。
在方法或属性的名字前面加上双下划线__
可将方法或属性变为私有
class Secretive:def __inaccessible(self):print "Bet you cant see me..."def accessible(self):print "The secret message is:"self.__inaccessible()
访问一下看:
s = Secretive()
s.__inaccessible()#! AttributeError: 'Secretive' object has no attribute '__inaccessible'
上面尝试访问这个方法会报错,看起来像是其他语言中的标准私有方法。
类的内部定义中,所有以双下划线开始的名称都被翻译成前面加上单下划线和类名的形式:
if __name__ == '__main__':s = Secretive()s._Secretive__inaccessible() # Bet you cant see me...
Java中也有这种类似的特例,能通过反射访问私有属性和方法。权且通过这种方式来理解就好了
推荐使用单下划线命名私有属性或方法。
类的命名空间
所有位于class语句中的代码都在类命名空间中执行。这个命名空间可由类内所有成员访问。
class MemberCounter:members = 0def init(self):MemberCounter.members += 1m1 = MemberCounter()
m1.init()
print MemberCounter.members #1m2 = MemberCounter()
m2.init()
print MemberCounter.members #2
上面的代码中在类作用域内定义了一个所有成员(实例)可以访问的变量,类似于Java中的类变量。注意每次都是通过类名去访问的。
如果实例中重绑定members:
m1.members = 'Hello'
print m1.members # Hello
print m2.members # 2
新members值被写到了m1的特性中,屏蔽了类范围内的变量。
指定超类
将其他类名写在class语句后的圆括号内可以指定超类(父类):
class Filter:def init(self):self.blocked = []def filter(self,sequence):return [ x for x in sequence if x not in self.blocked]class SPAMFilter(Filter):def init(self): #重写Filter超类中的init方法self.blocked = ['SPAM']
s = SPAMFilter()
s.init()
print s.filter(['SPAM','SPAM','SPAM','SPAM','SPAM','SPAM','eggs','bacon','SPAM'])
打印
['eggs', 'bacon']
其中SPAMFilter的filter方法继承了父类的方法。
检查继承
使用内建的issubclass
函数来查看一个类是否是另一个类的子类:
print issubclass(SPAMFilter,Filter) # True
s = SPAMFilter() # 检查一个对象是否是另一个类的实例
print isinstance(s,SPAMFilter) # True
多个超类
class Calculator:def caculate(self, expression):self._value = eval(expression)class Talker:def talk(self):print 'Hi, my value is ' , self._valueclass TalingCalculator(Calculator,Talker):passif __name__ == '__main__':tc = TalingCalculator()tc.caculate('1+2*3')tc.talk() # Hi, my value is 7
python中允许多重继承,但是有个注意的地方,如果一个方法从多个超类继承(超类中都有相同名字的方法),那么必须要注意一下超类的顺序,先继承的类中的方法会重写后继承的类中的方法。
Python中的抽象相关推荐
- python中的抽象含义_Python中下划线的5种含义你都知道吗?
英文原文:https://dbader.org/blog/meaning-of-underscores-in-python 本文介绍了Python中单下划线和双下划线("dunder&quo ...
- 利用抽象语法树检查Python中“未定义”的变量名
其实,Python是一种真正的动态语言,代码中的变量名本没有"声明"或"定义"的说法,语言本身也没有提供声明或定义变量的特殊语法(global除外).对程序员来 ...
- 全面理解Python中的类型提示(Type Hints)
众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...
- python中classes和class的区别-Python中的Classes和Metaclasses详解
类和对象 类和函数一样都是Python中的对象.当一个类定义完成之后,Python将创建一个"类对象"并将其赋值给一个同名变量.类是type类型的对象(是不是有点拗口?). 类对象 ...
- python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解
本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...
- Python中的http网络请求,用它就对了
软硬件环境 windows 10 64bits anaconda with python 3.7 requests 2.25.0 简介 requests是用来在Python中进行标准HTTP请求的第三 ...
- 教你在Python中实现潜在语义分析(附代码)
作者:PRATEEK JOSHI 翻译:李润嘉 校对:万文菁 本文约3400字,建议阅读15分钟. 本文将通过拆解LSA的原理及代码实例来讲解如何运用LSA进行潜在语义分析. 介绍 你有没有去过那种运 ...
- python sys模块作用_浅谈Python中的模块
模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...
- python中如何创建类的对象_python面向对象中如何建立具体的对象?
我们现在眼前所能看到的事物,都是具体的对象.很多小伙伴在面向对象中创建对象,其实都停留在对象名称的建立,计算机中并没有具体对象的描述属性.我们想要使用python中的类,建立的对象就需要是具体的.下面 ...
- python中append函数合并列表且列表内数字从高到低_35个高级Python知识点总结
No.1 一切皆对象 众所周知,Java中强调"一切皆对象",但是Python中的面向对象比Java更加彻底,因为Python中的类(class)也是对象,函数(function) ...
最新文章
- 计算机程序的思维逻辑 (63) - 实用序列化: JSON/XML/MessagePack
- frontpage 编辑html 乱码,在 FrontPage 2003 中编辑 PHP 及乱码问题
- hihocoder-Week200-Shorteniring Sequence
- IDEA2020版本如何导入jar包
- C#与C++之间dll的二维(多维)数组传递
- 工作160:总结VUE几种页面刷新方法
- 快速寻找发外链论坛的方法
- Retrofit 使用flatmap操作符时处理错误、异常
- linux getopt源码,linux getopt()
- centos7 安装教程
- 宅霸java_宅霸游戏联机平台下载|宅霸游戏联机平台免费版下载 v4.5.0 官方版_小皮网...
- CMSIS RTOS API,内核通用API接口
- 二维傅里叶变换深度研究-图像与其频域关系
- 【PyTorch】深度学习实战之PyTorch实现线性回归
- 魔王抓住了公主 等笑话
- 写给很累的你:面对苦难,停止内耗
- 引用echarts报错Cannot read property ‘init‘ of underfined
- 坦克大战第一节——画出自己的坦克(新手篇)
- springboot控制台日志打印到日志文件 (请求路径,执行sql,参数等)
- [YOLOv7/YOLOv5系列算法改进NO.20]Involution新神经网络算子引入网络