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

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类

原文地址:https://www.cnblogs.com/xiongying4/p/11504202.html