• 面向对象中各种方法的区别


    new,init,call方法的区别

    • 1.__new__(cls, *args, **kwargs)  创建对象时调用,是一个静态方法,返回当前对象的一个实例;   注意:这里的第一个参数是cls即class本身
    • 2.__init__(self, *args, **kwargs) 创建完对象后调用,对当前对象的实例的一些初始化,无返回值,即在调用__new__之后,根据返回的实例初始化;注意,这里的第一个参数是self即对象本身【注意和new的区别】
    • 3.__call__(self,  *args, **kwargs) 如果类实现了这个方法,相当于把这个类型的对象当作函数来使用,相当于 重载了括号运算符, 对象可call,注意不是类,是对象

    先有创建,才有初始化。即先__new__,而后__init__。

    关于__call__方法,先提到一个概念,叫可调动对象,平时定义的函数,内置函数和类都属于可调用对象,如果类中实现了__call__方法,那实例对象将成为一个可调用对象。

    单下滑线与双下划线区别

    _xxx 不能用'from module import *'导入

    __xxx__ 系统定义名字

    __xxx 类中的私有变量名

    "单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;

    "双下划线" 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据;

    实例变量与类变量的区别

    实例变量是对于每个实例都独有的数据,而类变量是该类所有实例共享的属性和方法。

    类变量又叫全局变量,是属于类的特性,实例先找实例化变量,然后再去找类变量

    静态方法与类方法的区别

    静态方法
    静态方法是定义在类名称空间的一个函数,定义形式是在def行前加修饰符@staticmethod 静态方法的参数可以是任意参数,不需要self参数 可以通过类名或者值为实例对象的变量,以属性的方式调用静态方法
    类方法
    类方法定义形式是在def行前加修饰符@classmethod,这种方法必须有一个表示其调用类的参数,一般用cls作 为参数名,也可以有多个其他的参数 类方法也是类对象的属性,可以以属性访问的形式调用 调用它的类将自动约束到方法的cls参数,可以通过这个参数访问该类的其他属性

    instance与type的区别

    isinstance

    1.格式

    isinstance(object,type-or-tuple-or-class) -> bool

    2.作用

    判断一个对象是某个类或子类的实例。

    3.参数介绍

    第一个参数(object)为对象,第二个参数(type)为类型名(int...)或类型名的一个列表((int,list,float)是一个列表)。其返回值为布尔型(True or flase)。

    具体的:

    (1)当第二个参数是type-or-tuple时

    若第二个参数只有一个单独的类型,对象的类型与参数二的类型相同则返回True;
    若第二个参数为一个元组类型,则若对象类型与元组中类型名之一相同即返回True。

    # coding=UTF-8
    >>> a = 4
    >>> isinstance (a,int)
    True
    >>> isinstance (a,str)
    False
    >>> isinstance (a,(str,int,list))#与元组类型之一相同
    True
    >>> isinstance(a,(str,list,float))#与元组类型都不相同
    False

    (2)当第二个参数是class时

    # coding=UTF-8
    class A(object):
        pass
    >>>a=A()
    >>>isinstance(a,A)
    True

    type

    1.格式

    type(object)--类型

    2.作用

    得到传入的object的类型

    三.比较

    1.共同点

    type和isinstance都可以判断变量是否属于某个内建类型

    2.不同点

    (1)type只接收一个参数,不但可以判断变量是否属于某个类型,而且可以得到参数变量未知的所属的类型;而isinstance只能判断是否属于某个已知类型,不能直接得到变量未知的所属的类型

    # coding=UTF-8
    class A(object):
        pass
    >>>a=A()
    #type判断变量是否属于某个类型
    >>>type(a)==A
    True
    #type得到变量类型
    >>>type(a)
     __main__.A
    #isinstance只能判断变量是否属于某个类型
    >>>isinstance(a,A)
    True

    (2)isinstance可以判断子类实例对象是属于父类的;而type会判断子类实例对象和父类类型不一样

     
    # coding=UTF-8
    class father(object):
        pass
    class son(father):
        pass
    >>>a=father()
    >>>b=son()
    >>>isinstance(a,father)
    True
    >>>type(a)==father
    True
    >>>isinstance(b,father)#isinstance得到子类实例是属于父类的
    True
    >>>type(b)==father#type对于子类实例判断不属于父类
     False

    综上所述,isinstance和type的应用场景是不同的:
    type主要用于获取未知变量的类型
    isinstance主要用于判断A类是否继承于B类

  • 相关阅读:
    Spring笔记——装配Bean
    Spring笔记——Spring之旅
    浅读Vue-Router源码记录
    稍微整理ES2020(es11)新东西
    前端实现批量打包下载文件
    CSS常见的三栏灵活布局实现方法
    不吹不黑,学完这篇,PDF导出就没有问题了
    不吹不黑,学完这篇,Word导出就没问题了
    不吹不黑,学完这篇,excel导出就没问题了
    Sass预编译 减法及除法计算问题
  • 原文地址:https://www.cnblogs.com/xiongying4/p/11504202.html
Copyright © 2020-2023  润新知