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的时候他就会调用第三个参数

 

 

posted @ 2019-05-30 19:13  程序杰杰  阅读(340)  评论(0编辑  收藏  举报