面向对象

1. 什么是面向对象?

  一种认知世界、分析世界的方法论。将万事万物抽象为类。

2. 类:class

  类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合。

  用计算机语言来描述类,就是属性和方法的集合。

3. 对象instance、object

  对象是类的具象,是一个实体。对于我们每个人这个个体,都是抽象概念人类的不同的实体。

例如: 你吃鱼

  你:就是对象;鱼:也是对象;吃是动作

  你是具体的人,是具体的对象。你属于人类,人类是个抽象的概念,是无数具体的个体的抽象。

  鱼,也是具体的对象,就是你吃的这一条具体的鱼。这条鱼属于鱼类,是无数的鱼抽象出来的概念。

  吃,是动作,也是操作,也是方法,这个吃是你的动作,也就是人类具有的方法。如果反过来,鱼吃人,吃就是鱼类的动作了。

4. 属性:它是对象状态的抽象,用数据结构来描述。

 操作:它是对象行为的抽象,用操作名和实现该操作的方法来描述。

5. 面向对象的三要素:

  封装:

    组装,将数据和操作组装到一起。

    隐藏数据:对外只暴露一些接口,通过接口访问对象。比如驾驶员使用汽车,不需要了解  汽车的构造细节,只需要知道使用什么部件怎么驾驶就行。

  继承:

    多复用:继承来的就不用自己写了

    多继承少修改:OPC(Open-Closed-Principle),使用继承来改变,来体现个性

  多态:

    面向对象编程最灵活的地方,动态绑定。

6. Python的类:

  定义:

      class ClassName:

        语句块

  1. 必须使用class关键字

  2. 类名必须是用大驼峰命名

  3. 类定义完成后,就产生了一个类对象,绑定到了ClassName上

例如:

class MyClass:

  """A example class"""

  x = 'abc'    # 类属性

  def foo(self):         # 类属性foo,也是方法

    return 'My Class'

7. 类的对象及其属性:

  类对象:类的定义就会生成一个类对象

  类的属性:类定义中的变量和类中定义的方法都是类的属性

  类变量:x是类MyClass中的变量

MyClass中,x、foo都是类的属性,__doc__也是类的属性

foo方法是类的属性,如同吃是人类的方法,但是每一个具体的人才能吃东西,也就是说吃是人的实例才能调用的方法。

foo是method方法对象,不是普通的函数对象function了,它必须至少有一个参数,且第一个参数必须是self(self可以换个名字),这个参数位置就留给了self。

self指代当前实例本身

实例化

a = MyClass()

使用上面的语法,在类对象名称后面加一个括号,就调用类的实例化方法,完成实例化。

实例化就真正创建一个该类的对象(实例)。

实例化都获得的实例,是不同的实例,即使是使用同样的参数实例化,也督导不一样的对象。

Python类实例化后,会自动调用__init__方法。这个方法第一个参数必须留给self,其他参数随意。

8. __init__方法:

  MyClass()实际上调用的是__init__(self)方法,可以不定义,如果没有定义会子啊实例化后隐式调用。

  作用:对实例进行初始化

9. 实例对象instance:

  类实例化后一定会获得一个对象,就是实例对象。

  __init__方法的第一个参数self就是只代某一个实例。

  类实例化出一个实例对象,实例对象会绑定方法。

实例变量:它时每一个实例自己的变量,时自己独有的;类变量时类的变量,是类的所以实例共享的属性和方法。

10. 

特殊属性      含义

__name__    对象名

__class__     对象的类型

__dict__       对象的属性的字典

__qualname__        类的限定名

 

总结:

  是类的,也是这个类多有实例的,其实例都可以访问到;是实例的,就是这个实例自己的,通过类访问不到。

  类变量是属于类的变量,这个类的所以实例可以共享这个变量。

  实例可以动态的给自己增加一个属性。实例__dict__[变量名]和实例.变量名都可以访问到。

  实例的同名变量会隐藏这类变量,或者说是覆盖了这个类变量。

实例属性的查找顺序:

  指的是实例使用.来访问属性,会先找自己的__dict__,如果没有,然后通过属性__class__找到自己的类,再去类的__dict__中找

注意:如果实例使用__dict__[变量名]访问变量,将不会按照上面的查找顺序找变量了。

11. 装饰一个类

  回顾,什么是高阶函数?什么是装饰器函数?

  思考:如何装饰一个类?

  需求:为一个类通过装饰,增加一些类属性

 

之所以能够装饰,本质上是为类对象动态的添加了一个属性,而Person这个标识符指向这个类对象。

类方法和静态方法

前面例子中定义的__init__等方法,这些方法本身都是类的属性,第一个参数必须是self,而self必须指向一个对象,也就是类必须实例化之后,有实例来调用这个方法。

12. 类方法:

 

  1. 在类定义中,使用@classmethod装饰器的方法

  2. 必须至少有一个参数,且第一个参数留给了cls,cls指代调用者即类对象自身

  3. cls这个标识符可以是任意合法名称,但是为了易读,请不要修改。

  4. 通过cls可以直接操作类的属性

13. 静态方法

  

  1.在类定义中,使用@static_method装饰器修饰的方法

  2. 调用时,不会隐式的传入参数

      静态方法,只是表明这个方法属于这个名词空间。函数归在一起,方便组织管理。

 

类几乎可以调用所以内部定义的方法,但是调用普通方法时会报错,原因时第一参数必须时类的实例。

实例也几乎可以调用所有的方法,普通的函数的调用一般不可能出现,因为不允许这么定义。

总结:

  类除了普通方法都可以调用,普通方法需要对象的实例作为第一参数。

  实例可以调用多有类中定义的方法(包括类方法、静态方法), 普通方法传入实例自身,静态方法和类方法需要找到实例的类。

 

posted @ 2017-11-06 19:13  thinkingjxj  阅读(523)  评论(0编辑  收藏  举报