zoukankan      html  css  js  c++  java
  • 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的时候他就会调用第三个参数

     

  • 相关阅读:
    android studio快捷键大全
    HTML5规范尘埃落定,5个开发工具推荐
    javascript:设置URL参数的方法,适合多条件查询
    MyBatis 多表联合查询及优化
    js动态向页面中添加表格
    mysql装完电脑里面没mysql相关服务
    javascript 实现一个网页,然后计算出有多少剩余时间的倒计时程序
    xcode于Archive当产生安装包遇到ld: library not found for -lPods
    计算机网络 2. 应用层
    Android手游《》斗地主完整的源代码(支持单机和网络对战)
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/10951505.html
Copyright © 2011-2022 走看看