python类和对象
对象=属性+方法
类就相当于一个对象,调用的时候我们需要和调用方法一样给它一个小括号,并且需要把它赋给某个变量,因为如果不赋给某个变量的话,它不指向任何变量,会被垃圾回收器回收
其实他就是一个构造函数,使用它的时候,实例化一下嘛!
封装:如list()下好多的方法,都是封装起来我们直接调用的
继承:子类自动共享父类之间数据和方法的机制
多态:不同对象对同一方法响应不同的行动
如下方图片,名字一样,响应不一样
*self是什么?
相当于this
*__init__
python中默认调用的都是前后俩个下划线
这个__init__相当于构造函数,就是实例化它的时候,可以赋予相应的值,和C#实例化一个类,类中可传参数是一样的
*公有和私有
实际上python是将变量名改编成如下:
可以看出,这样也是能访问到该变量的值的
所以python的私有是伪私有,它实际上也是可以被访问的。和C#等语言private有很大的区别
继承
经试验,一个类可以继承多个父类
*如果子类定义和父类相同名字的属性或方法,则会覆盖子类中调用父类的方法
上述shark重写了__init__方法,因此调用move()的时候会报错,因为没有x与y
解决方案
1.将shark中实例化方法加一行这个
,这个self指向的是子类shark,因此叫未绑定的父类方法
2.使用super()方法,连self参数都不用传,他会自动调用基类/父类的方法
使用super()省略self但是如果有其他参数还需要正常传
*可多重继承
示例:
~~~~~~~~~~~~~组合~~~~~~~~~~~~~
所谓的组合就是把类的实例化放到新类里面,如下,在水池的初始化中,实例化了多个其他类
无论是属性还是方法,后面定义或者赋值的名字相同会相互覆盖
就算在一个类中定义了同名的一个属性和一个方法,谁写在下边谁就会覆盖另一个!!!,就是一个类中无论属性还是方法,不能重复,如果重新,下面会覆盖上面
而且即使实例化一个类,令它的属性或方法等于其余的任意方法或属性,都会覆盖这个实例化的对象
对于类内部定义的属性和方法(self.aaa 与def aaa():)属性会覆盖方法,因此最好属性用名词而方法用动词,不要覆盖哦
因此:
~~~!!!!!!!!!!!
理解对象和实例化对象(比如类:A)
1类似于函数访问全局变量一样,当你实例化A的时候,你指向的是A中的属性和方法,当你试图改变A种属性和方法的时候,你会创建一个局部和A的这个属性或方法同名的属性或方法,因此你改变这个属性或方法之后,A对于这个属性或方法的改变便不会影响到你,因为子类中有不会去找父类,当A改变的属性或方法,你没有改变的时候,那么你就会跟着A一起变
而且!!!即使当A被删除的时候你也仍然具有A被删除前的所有属性或方法,可以理解成A把他自身的属性或方法删除,但是你指向的是他删除前的内存区域,那个内存区域内存储了A删除前所有的属性或方法,即使A不再指向那个内存,但是以前由A实例化的对象们仍然指向那里!!!
最好的理解就是只有A能改变A内存中的属性或方法,由它实例化的不能改变A指向的内存中的属性或方法,如果试图改变,它实际上是在自己内部重新生成了一个名字一样的属性或方法,而A即使被删除,删除的只是A的指向,以前由A实例化的对象们指向不变!! 因此只能说删除了A只能说明改变删除前A指向内存的属性和方法不可能改变了。
之所以定义类中方法加self,相当于他是一个构造函数,和JS的构造函数this一样,这样由该类实例化的对象调用的时候,方法才会指向调用的实例化对象
~~~~~~~~~~一些相关的BIF~~~~~~~~~
*issubclass()
如果class是classinfo的子类则返回True
1.一个类会被认为是自身的子类
2.classinfo可以是类对象组成的元组,只要class与其中任何一个候选类的子类满足条件,则返回True
object是所有类的基类
*isinstance(object,classinfo)
检查object是否是classinfo的实例对象
1.classinfo可传入候选类元组,一个个检查,如果有一个匹配则返回True
以前就是用它来验证变量的浮点型还是整型等等
2.如果第一个参数传入的不是对象,它永远是fals,很正常,你后面放的是类的元组,前面不放对象可不是一定是False嘛
3.如果classinfo不是类或者由类对象组成的元祖,会抛出一个TypeError异常
*hasattr(obj,name)
测试一个对象里面是否有指定的属性
name参数一定是字符串,要不然python怎么知道,你是这个属性还是这个变量啊,其实这个肯定我们都知道啦!写出来注意一下下就好啦
*getattr(object,name[,default])
返回对象指定的属性值,如果属性值不存在,则返回default,如果default未指定,找不到属性则会报AttributeError的异常
*setattr(obj,name,value)
设置对象中指定属性的值,如果指定的属性值不存在,则会新建一个属性,并给它赋值
*delattr(obj,name)
删除对象中指定的属性,如果属性不存在则抛出AttributeError的异常
*property
第一个参数(fget):获取属性的方法
第二个参数(fset):设置属性的方法
第三个参数(fdel):删除属性的方法
第四个参数(doc): -_-|| 没讲
下图
当你直接调用x他就会调用第一个参数
当你给x赋值的时候他就会调用第二个参数
当你删除x的时候他就会调用第三个参数