类与对象

1.什么是类

类和函数一样是程序编程的一种方式,在处理某些问题的时候类比函数更加适合让编程变得简化,在python里面函数式编程和类编程都是为了简化代码的一种编程方式,具体应用那个则由具体问题

对应。

2.什么是对象

对象是由类创造出来的变量,它可以调用类里面的所以函数(方法),效果就像函数的函数名,可以操作函数一样。

3.类与对象的编程方式

简述python中类和对象的关系 python 类和对象_初始化

简述python中类和对象的关系 python 类和对象_简述python中类和对象的关系_02

liu是类,a为liu这个类创造出来的对象。

4.类里面self的作用

在类编程里self是一个重要的参数,它在类的方法里面无处不在,那么它到底是什么呢?

简述python中类和对象的关系 python 类和对象_python中类和对象_03

简述python中类和对象的关系 python 类和对象_父类_04

由代码可以看出这里的这个的self就a这个对象,所以python自动传入的这个参数就a这个变量。

为什么要把a这个变量传入类里面的方法中呢?原因是为了在类里面进行封装。

5.封装

当有多个参数需要传入类里面的方法的时候,可以利用封装这些参数,让传参变得很简洁。

简述python中类和对象的关系 python 类和对象_初始化_05

简述python中类和对象的关系 python 类和对象_父类_06

这是self的一种利用方式,但是我们一般不这么做,

简述python中类和对象的关系 python 类和对象_python中类和对象_07

简述python中类和对象的关系 python 类和对象_简述python中类和对象的关系_08

简述python中类和对象的关系 python 类和对象_python中类和对象_09

简述python中类和对象的关系 python 类和对象_父类_10

如果只是在f1里面定义self.bb=123,不执行f1函数则f2 没有办法拿到self.bb=123这个代码,就无法打印self.bb了。

根据以上的代码,如果类里面想要使用self.bb则需要在调用里面方法的时候已经把self.bb=123定义了。

在封装的时候我们利用__init__这个方法进行封装,原因是当我们执行类名+()的时候__init__就执行了。

简述python中类和对象的关系 python 类和对象_父类_11

简述python中类和对象的关系 python 类和对象_父类_12

只要__init__执行以后,就可以把init里的东西都定义了,以后在类或者类外面的代码都可使用

简述python中类和对象的关系 python 类和对象_初始化_13

简述python中类和对象的关系 python 类和对象_父类_14

一旦定义以后里面用self 外面用a。注意这里的self 等于啊只有在类里面才默认,就是在类里面输出self.dd和a.dd都是一样的,但是外面不不行,除非定义一个self = a才能执行self.bb

因为a在外面创建的可以为全局变量,self只是类里面的方法创建的为局部变量,这种初始化的方法 我们称为构造方法。对应python销毁对象的方法为析构方法__del__python自己执行的。

6.继承

类与类之间存在子类和父类的关系。子类可以继承父类的方法。

简述python中类和对象的关系 python 类和对象_初始化_15

简述python中类和对象的关系 python 类和对象_父类_16

并且继承具有传递性,a继承b,b继承c,则a就会继承c的方法。

简述python中类和对象的关系 python 类和对象_父类_17

简述python中类和对象的关系 python 类和对象_简述python中类和对象的关系_18

如果两个类里面都有会优先去自己里面找方法,没有再去找父类方法。

多继承:

简述python中类和对象的关系 python 类和对象_初始化_19

简述python中类和对象的关系 python 类和对象_python中类和对象_20

简述python中类和对象的关系 python 类和对象_父类_21

简述python中类和对象的关系 python 类和对象_简述python中类和对象的关系_22

简述python中类和对象的关系 python 类和对象_初始化_23

简述python中类和对象的关系 python 类和对象_python中类和对象_24

多继承只在python里面有,寻址方法的顺序是自己,左边第一个父类,第二个父类,以此类推。

多继承里面当父类有多重的情况利用图形记忆

情况1:

简述python中类和对象的关系 python 类和对象_简述python中类和对象的关系_25

情况2:

简述python中类和对象的关系 python 类和对象_初始化_26

简述python中类和对象的关系 python 类和对象_父类_27

如果是上图的情况,则python会找1然后2然后3然后是1和3的父类最后4.所以在第一种情况中间加了一个父类的时候,会找完夹在中间的父类,再按照情况1来找。

7.多态

python原生支持多态

简述python中类和对象的关系 python 类和对象_初始化_28

简述python中类和对象的关系 python 类和对象_python_29

在python里面往函数里面传类的时候不用把类的名字规定好,只要一个人x。什么类都可以传入。其它语言里面需要在x前面规定类的名字。

并且python默认没有接口。

补充:

简述python中类和对象的关系 python 类和对象_初始化_30

注意在执行某个类里面的方法的时候,如果这个方法又调用的其它方法,这个时候你要注意,调用方法的时候self是那个类创造的对象,就由那个类开始找这个方法,而不是从正在

执行的这个类里面开始找方法。A,B,C都有ooo方法,上图d1找xxx的时候到了c在里面用xxx执行ooo,但是不是从c开始找ooo,因为self的d1由D所创造,所以根据找方法原则,则会在D类的位置

开始找ooo,所以最后在A里面找到,而不是C里面找到。

继承父类的__init__方法

未继承:

简述python中类和对象的关系 python 类和对象_父类_31

简述python中类和对象的关系 python 类和对象_父类_32

继承以后:

简述python中类和对象的关系 python 类和对象_python_33

简述python中类和对象的关系 python 类和对象_父类_34

注意如果出现b()这样的代码就会初始化一次所以打印了这个多22,11。

简述python中类和对象的关系 python 类和对象_python_35

简述python中类和对象的关系 python 类和对象_父类_36

这样就不会出现上面代码中的多次初始化。注意这里super里面传的self是c自己,他被传入上面的代码里面进行初始化。

简述python中类和对象的关系 python 类和对象_父类_37

简述python中类和对象的关系 python 类和对象_简述python中类和对象的关系_38

初始化的顺序由代码决定。

利用反射查找类和对象里面的成员

简述python中类和对象的关系 python 类和对象_父类_39

简述python中类和对象的关系 python 类和对象_初始化_40

对象可以找类和对象里面的成员,类只能找类里面的成员

利用反射导入模块,查找类创建对象,查找对象里面的元素

简述python中类和对象的关系 python 类和对象_python_41

简述python中类和对象的关系 python 类和对象_简述python中类和对象的关系_42

静态字段

尽量保持,自己的成员,自己去访问,除了类中的方法,用对象去访问

简述python中类和对象的关系 python 类和对象_python中类和对象_43

简述python中类和对象的关系 python 类和对象_简述python中类和对象的关系_44

以后不到万不得已不要用对象a去调用,都用liu去调用。

简述python中类和对象的关系 python 类和对象_python中类和对象_45

简述python中类和对象的关系 python 类和对象_python_46

用类去调用类里面的方法需要传入这个类创立的对象作为参数,所以我们一般不这么做,用对象调用的时候参数是python帮我们传输的。

静态方法

简述python中类和对象的关系 python 类和对象_简述python中类和对象的关系_47

简述python中类和对象的关系 python 类和对象_初始化_48

静态方法不用传入对象这个参数,并且对象和类都可以访问,不到万不得已都用类访问。

静态方法不需要创建对象就可以调用,相当于在类里面写了一个函数,这个对Java和c#就有用,因为他们只能用面向对象去编程。

类方法

简述python中类和对象的关系 python 类和对象_初始化_49

简述python中类和对象的关系 python 类和对象_python_50

类方法默认传入参数是类名,一般用类调用,虽然对象也可以调用,并且传入参数也是类名(python好变态)

特性

简述python中类和对象的关系 python 类和对象_python_51

简述python中类和对象的关系 python 类和对象_父类_52

通过类似于字段的形式用对象调用函数,注意这里只能用对象调用,因为没有括号所以如果用类调用没有办法自动传入self这个参数。并且特性方法只能有一个参数self多了

会报错,因为self是python自动传入的。其它参数只能手动传入,可是没有括号让其传入参数,所以会报错。

重新设置特性的值

简述python中类和对象的关系 python 类和对象_python中类和对象_53

简述python中类和对象的关系 python 类和对象_python中类和对象_54

重新设置字段

简述python中类和对象的关系 python 类和对象_python中类和对象_55

简述python中类和对象的关系 python 类和对象_父类_56

成员修饰符(公有,私有)

简述python中类和对象的关系 python 类和对象_简述python中类和对象的关系_57

简述python中类和对象的关系 python 类和对象_简述python中类和对象的关系_58

成员修饰符用两个__表示,并且只能在内部用方法输出

简述python中类和对象的关系 python 类和对象_父类_59

简述python中类和对象的关系 python 类和对象_python_60

外部输出会出错

对于私有的只有自己能访问自己,子类和父类都不能访问,只有自己好使

简述python中类和对象的关系 python 类和对象_父类_61

简述python中类和对象的关系 python 类和对象_简述python中类和对象的关系_62

函数也是一样的只有在内部方法里面执行

简述python中类和对象的关系 python 类和对象_简述python中类和对象的关系_63

简述python中类和对象的关系 python 类和对象_python中类和对象_64

简述python中类和对象的关系 python 类和对象_父类_65

简述python中类和对象的关系 python 类和对象_初始化_66

静态方法和普通方法都是可以在内部调用的

python强行外部调用私有方法,万不得已不要用

简述python中类和对象的关系 python 类和对象_python_67

简述python中类和对象的关系 python 类和对象_python_68

面向对象特殊的方法

__init__,__del__

简述python中类和对象的关系 python 类和对象_python_69

简述python中类和对象的关系 python 类和对象_简述python中类和对象的关系_70

对象后面加()执行__call__方法

_getitem__,_setitem__,_delitem__

简述python中类和对象的关系 python 类和对象_python中类和对象_71

简述python中类和对象的关系 python 类和对象_python中类和对象_72

简述python中类和对象的关系 python 类和对象_python_73

简述python中类和对象的关系 python 类和对象_python中类和对象_74

__dict__获取对象和类里面的元素

简述python中类和对象的关系 python 类和对象_父类_75

简述python中类和对象的关系 python 类和对象_初始化_76

__iter__

简述python中类和对象的关系 python 类和对象_python中类和对象_77

简述python中类和对象的关系 python 类和对象_python中类和对象_78

注意在执行__call__方法的时候,self还是对象本身,不是对象加括号产生的新变量

所以某个类里面的self都是对象这个变量。

简述python中类和对象的关系 python 类和对象_父类_79

简述python中类和对象的关系 python 类和对象_python中类和对象_80

简述python中类和对象的关系 python 类和对象_父类_81

注意图中的self.__new__就是FOO调用__new__方法,所以才会到FOO里面去找__new__方法的,而不是obj,因为

__call__里面的参数是self是FOO所以用FOO调用方法__new__的时候就是用类调用所以参数里面要加入self,注意这里的

self也是Foo,因为类调用函数的时候可以传对象也可传类名。

如果一个类是另外一个类创造的则调用它的时候。它可以充当类或者对象。

简述python中类和对象的关系 python 类和对象_父类_82

上面地址讲诉了新式类和经典类的区别。

对象调用函数会默认传入对象这个参数就是self,类调用函数不会默认传入参数,所以参数可以传类,对象或者任何东西。