类与对象
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,类调用函数不会默认传入参数,所以参数可以传类,对象或者任何东西。