Python 基础:类与函数

时间:2022-04-28
本文章向大家介绍Python 基础:类与函数,主要内容包括1、Python 中的类(上)、1.2 方法、1.3 访问控制、1.4 总结:、2、Python 中的类(中)、2.2 总结:、3、Python 中的类(下)、3.2 定制一个类、3.3 总结:、4、Python 中 self 的含义、5、Python 描述符、6、Python 元类(metaclass)、7、Python 函数相关、8、Python 迭代器和生成器、8.2 生成器、8.3 总结、9、from … import … 执行机制、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

1、Python 中的类(上)

1.1 数据属性

  • 类数据属性和实例数据属性
  • 特殊的类属性
  • 属性隐藏

1.2 方法

  • 实例方法
  • 类方法
  • 静态方法

1.3 访问控制

  • 单下划线”_”
  • 双下划线”__”

1.4 总结:

本文介绍了Python中class的一些基本点:

  • 实例数据属性和类数据属性的区别,以及属性隐藏
  • 实例方法,类方法和静态方法直接的区别
  • Python中通过”_”和”__”实现的访问控制

Refer:http://python.jobbole.com/82297/

2、Python 中的类(中)

2.1 继承

  • 继承中的__init__
  • super
  • MRO
  • __slots__
  • 子类没有__slots__属性
  • 子类拥有__slots__属性

2.2 总结:

  • 本文介绍了Python中的继承,当使用多继承的时候,可以使用super关键字去访问父类中被子类覆盖的方法;对于方法的调用,需要参照MRO。
  • 另外介绍了Python类的__slots__属性,通过这个属性可以限制类实例的可用属性。

Refer:http://python.jobbole.com/82308/

3、Python 中的类(下)

3.1 类构造和初始化

  • __new__特性
  • 重写__new__
  • __init__的调用
  • 派生不可变类型

3.2 定制一个类

3.3 总结:

  • 文中介绍了类的构造和初始化方法:”__new__”和”__init__”。
  • “__new__”方法是新式类特有的方法,通常情况下,__new__方法会创建返回cls(cls指代当前类)的实例,然后调用该类的”__init__”方法作为初始化方法,该方法接收这个实例(即self)作为自己的第一个参数,然后依次传入”__new__”方法中接收的位置参数和命名参数;但是,如果”__new__”没有返回cls(即当前类)的实例,那么当前类的”__init__”方法是不会被调用的。
  • 通过”魔术方法”,可以对自定义类进行定制、扩展,使得自定义类变得强大、易用。

Refer:http://python.jobbole.com/82312/

4、Python 中 self 的含义

  • self代表类的实例,而非类
  • self不必非写成self
  • self可以不写吗
  • 在继承时,传入的是哪个实例,就是那个传入的实例,而不是指定义了self的类的实例
  • 在描述符类中,self指的是描述符类的实例

总结:

  • self在定义时需要定义,但是在调用时会自动传入。
  • self的名字并不是规定死的,但是最好还是按照约定是用self
  • self总是指调用时的类的实例。

Refer:http://python.jobbole.com/81921/

5、Python 描述符

  • 描述符协议中定义了“__get__”、“__set__”、”__delete__” 这些特殊方法

Refer:http://python.jobbole.com/81211/

6、Python 元类(metaclass)

  • 类也是对象
  • 动态地创建类
  • 到底什么是元类
  • __metaclass__属性
  • 自定义元类
  • 为什么要用metaclass类而不是函数?
  • 究竟为什么要使用元类?

结语:

  • 首先,你知道了类其实是能够创建出类实例的对象。好吧,事实上,类本身也是实例,当然,它们是元类的实例。
>>>class Foo(object): pass
>>> id(Foo)
142630324
  • Python中的一切都是对象,它们要么是类的实例,要么是元类的实例,除了type。type实际上是它自己的元类,在纯Python环境中这可不是你能够做到的,这是通过在实现层面耍一些小手段做到的。其次,元类是很复杂的。对于非常简单的类,你可能不希望通过使用元类来对类做修改。你可以通过其他两种技术来修改类:

1) Monkey patching

2)   class decorators

  • 当你需要动态修改类时,99%的时间里你最好使用上面这两种技术。当然了,其实在99%的时间里你根本就不需要动态修改类 :D

Refer:http://python.jobbole.com/21351/

7、Python 函数相关

  • 可变长度参数(*args 和 **kwargs)
  • 非关键字变长参数(元组)
  • 关键字变长参数(字典)
  • 匿名函数(lambda)
  • 几个内建函数:filter(),map(),reduce()

Refer:http://python.jobbole.com/82300/

8、Python 迭代器和生成器

8.1 迭代器

  • __iter__()和next()方法
  • 自定义迭代器
  • 迭代器和可迭代对象

8.2 生成器

  • 生成器执行流程
  • 生成器表达式
  • 递归生成器
  • 生成器的send()和close()方法

8.3 总结

本文介绍了Python迭代器和生成器的相关内容。

  • 通过实现迭代器协议对应的__iter__()和next()方法,可以自定义迭代器类型。对于可迭代对象,for语句可以通过iter()方法获取迭代器,并且通过next()方法获得容器的下一个元素。
  • 像列表这种序列类型的对象,可迭代对象和迭代器对象是相互独立存在的,在迭代的过程中各个迭代器相互独立;但是,有的可迭代对象本身又是迭代器对象,那么迭代器就没法独立使用。
  • itertools模块提供了一系列迭代器,能够帮助用户轻松地使用排列、组合、笛卡尔积或其他组合结构。
  • 生成器是一种特殊的迭代器,内部支持了生成器协议,不需要明确定义__iter__()和next()方法。
  • 生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果。

9、from … import … 执行机制

http://python.jobbole.com/84174/

Refer:http://python.jobbole.com/82320/