Python里面这些点,听说80%的新手都会一脸懵逼

Python虽然语法简单,通俗易懂,可是再简单它也是一门语言,就像一棵大树,总有一些树枝是弯弯绕绕的,让新手看完以后一脸懵逼,今天咱们就来讲说这几个点,反正我学的时候是很困惑的!c++

01.函数里面的 *args程序员

1).可变参数数组

这个是什么鬼,尤为是有其余c,c++语言基础的人,看到这个点,必定懵逼了,难道是指针,两个**又是什么鬼?函数

其实这个Python里面的函数入参的几种形式,假如你来设计一个语言,一个函数fun(),里面要传参数进来,要考虑扩展性:变量会有不少种形态,有多是变量,也多是数组,也多是结构体,或者是哈希数组。学习

好比你有一个累加功能的函数:编码

Python里面这些点,听说80%的新手都会一脸懵逼

 

每次调用函数都要传一个列表或者元组进去,很是死板,不灵活,若是我要传多个列表,多个变量,我又不想改接口,可是改为下面这样就灵活不少:.net

Python里面这些点,听说80%的新手都会一脸懵逼

 

*args:表示可变参数,就是传入的参数个数是可变的,能够是1个、2个到任意个或者0个,其实就是把一堆参数看成一个数组(Python列表或者元组传递进来)。设计

02.关键字参数 **kwargs3d

关键字参数可让你输入0或者多个含参数名的参数,而且自动组装为一个字典指针

Python里面这些点,听说80%的新手都会一脸懵逼

 

你函数的接口设定为**kwargs,这样的好处,一个是灵活,扩展性好,也就是说我预留的了扩展的接口,你程序调用的时候能够根据本身的需求传1个,多个或者不传均可以。

另外:不用太纠集args和kwargs这些英语单词,只是你们约定这么叫而已

03.脸萌的@property

有其余经验的程序员,看到这个奇奇怪怪的@加一个关键字,必定是一脸懵逼,这实际上是Python类里面的一些封装。这些都是类的内置装饰器,有一些特殊的用途!

1).装饰器@property

咱们大部分人都比较熟悉好比Java的get/set方法,好比:

Python里面这些点,听说80%的新手都会一脸懵逼

 

2).可是这样写比较麻烦,须要经过函数get/set 来访问属性

有木有直接对属性进行操做的同时就能够对属性进行处理,好比咱们调用student.score=88,这一个时候会自动调用set_score函数,这样就很是灵活和简便!

Python里面为了简洁和优雅,设计了@property

Python里面这些点,听说80%的新手都会一脸懵逼

 

对于外边访问的属性score,咱们经过Python类中的property装饰器对它进行升级,改造,让它能变的更加灵活和强大!

其实它就是绑定了一些方法(fget,fset和fdel).尤为是你对属性进行升级功能而不改变外边代码的时候,这一招就很是有用!

 

04.傻傻分不清@classmethod和@staticmethod

看完了上面的property,刚刚回过神,如今又来了两个更大的家伙是啥,其实这个两个类装饰器都是类里面的概念!

只要是写代码最后必定会走到类而类的封装和扩展是必需要掌握的,如何能有更好的封装性呢,classmethod和staticmethod就派上用场了!

1).假若有一个场景,计算日期的类

Python里面这些点,听说80%的新手都会一脸懵逼

 

2).更改需求,若是咱们传入的类初始化是字符串型日期

咱们目前的类的init函数是一个三个参数的,若是咱们但愿咱们传入一个字符串性的日期"2018-10-8",而后返回像上面的日期2018/10/8,怎么办呢?

传统的作法:

Python里面这些点,听说80%的新手都会一脸懵逼

 

这样的作法会致使每次初始化的时候,都要先分割成3个参数再导入类,很是麻烦!

@staticmethod(类的静态方法就派上场)

Python里面这些点,听说80%的新手都会一脸懵逼

更多资源与教程与你共享。

我作开发几年的时间,若是你们对于学习Python的学习方法,学习路线以及:是自学仍是培训的疑问,均可以加裙227-435-450随时来问我。

经过静态函数,直接内置了分割的功能,会简洁不少,并且封装性也好不少!

3).可是静态方法也有弊端

由于静态方法是硬编码,若是咱们修改了Date这个类的名字,好比叫MyDate这样的话,会致使咱们写的format_date里面的代码也要改,由于咱们直接是return Date()... ,好这个时候类方法classmethod上场了

Python里面这些点,听说80%的新手都会一脸懵逼

 

咱们申明了一个类方法format_date2,里面有一个很是关键的变量cls,其实它就是类自己,这样不管咱们把类的名字改为什么,都没有关系,由于咱们返回的就是cls(...),这样代码的柔性就强了不少!

有同窗看到这里会问,那静态函数还有什么用处,类方法都能代替了!在作一些类的预处理,或者条件判断的时候,静态函数仍是颇有用的!

 

05.super是啥

都说Python语言跟英语很相似,语法简单,通俗易懂,可是看到super这样关键字的时候,会有点懵懂!

其实只要是面向对象的语言,都有类的继承啊,组合等等。Python固然也有这样的设计,其实若是学过Java会很是好理解!好比子类要调用父类的方法,或者覆盖父类的方法都会用到super().

1).调用父类的方法

Python里面这些点,听说80%的新手都会一脸懵逼

 

有的同窗说我是否是能够直接调用A.say_hello(self),最好不要,涉及多重继承的时候就会有问题

2).初始化父类的__init__方法

Python里面这些点,听说80%的新手都会一脸懵逼

 

 

06.ABC模块

新手有的时候看到下面的代码会很懵,有点丈二和尚摸不着头脑的赶脚:

Python里面这些点,听说80%的新手都会一脸懵逼

 

C++里面有抽象基类的概念,Python里面的类在设计的时候,也考虑到了这一点,可是因为Python自己的特性是一切皆对象,大部分的时候都依赖鸭子类型。

为了完成抽象基类的功能,借助了第三方模块abc(abc是抽象类的缩写,不是英语abc的意思)

b=Bird()
TypeError: Can't instantiate abstract class Bird with abstract methods fly

Bird继承ABC,也就是说Bird是一个抽象类,不能被初始化,好比你初始化一下,会报错的。

这个类的目的就是让继承它的子类必定要实例化fly函数,不然子类也永远没法实例化

Python里面这些点,听说80%的新手都会一脸懵逼

 

其实当你彻底熟悉这些用法以后,你要开始思考Python为啥要这么设计,慢慢的你就会领悟Python这门语言的设计思想,而不是只是看它的招式,当你明白里招式背后的含义,恭喜你,你的功力又大涨了!

相关文章
相关标签/搜索