流浪小小翔

导航

python的类与对象

类与对象

1.什么是类

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

对应。

 

2.什么是对象

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

 

3.类与对象的编程方式

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

 

4.类里面self的作用

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

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

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

 

5.封装

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

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

 

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

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

 

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

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

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

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

 

6.继承

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

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

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

 

多继承:

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

 

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

情况1:

 情况2:

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

 

7.多态

python原生支持多态

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

并且python默认没有接口。

 

补充:

 

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

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

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

 

继承父类的__init__方法

未继承:

继承以后:

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

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

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

 

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

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

 

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

 

静态字段

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

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

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

 

静态方法

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

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

 

类方法

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

 

特性

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

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

 

重新设置特性的值

 

重新设置字段

 

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

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

外部输出会出错

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

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

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

 

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

 

面向对象特殊的方法

__init__,__del__

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

 

_getitem__,_setitem__,_delitem__

 

 

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

 

__iter__

 

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

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

 

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

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

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

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

 

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

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

posted on 2016-06-25 15:44  流浪的根号3  阅读(1189)  评论(0编辑  收藏  举报