1、python中所有类默认继承object类,而object类提供了很多原始的内置属性和方法,所有用户定义的类在python 中也会继承这些内置属性。我们可以通过dir()进行查看。虽然python提供了很多内置属性但实际开发中常用的不多。而很多系统提供的内置属性实际开发中用户都要重写后才会使用。

class Foo(object):#在python3中object可以不写
pass
dir(Foo) #查看python中给对象提供的内置属性
***结果****
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__e
at__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init_
ubclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__
shook__', '__weakref__']

2、__init__和__new__的使用

1、__init__方法的使用和功能:
1、用来构造初始化函数,用来给类的实例进行初始化属性,所以不需要返回值。
2、在创建实例时系统自动调用
3、自定义类如果不定义的话,默认调用父类的,同理继承也是,子类若无,调用父类,若有,调用自己的.
对于第3条举例说明如:
class A():
def __init__(self,name):
self.name=name
class B(A):
pass
obj=B() #对B进行实例
***报错****
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'name
当我们对B进行实例的时候,B本身没有__init__方法,但是父类有,这个时候我们直接通过 obj=B()进行实例 就会报错,所以我们需要给类传入参数obj=B('alex')才能进行实例
2、__new__方法使用和功能:

    1、__new__方法用于给类创建对象,并且返回这个对象。
2、因为给类创建实例,所以至少传递一个参数cls,参数cls 代表实例化的类,此参数在实例化时由Python解释器自动提供
3、在类实例化是内部创建实例的函数,并返回这个实例,所以他是实例中最先调用的方法,一般不要认为的定义该方法
4、创建实例返回实例,所以要有返回值,return父类__new__出来的实例,或者直接是object的__new__出来的实例 class Student(object): #object 在python 3中可以不写
def __init__(self,name):
self.name = name
print("这是__init__方法")
def __new__(cls,*args,**kwargs):
print('这是__new_方法')
return obj.__new__(cls)
s=Student('tom')
****结果*****结果如下:注意__new__的执行顺序在__init__之前
这是__new__方法
这是_init__方法
3.__init__和__new__使用的联系
1.__init__第一个参数是self,表示需要初始的实例,由python解释器自动传入,而这个实例就是这个__new__返回的实例
2.然后 __init__在__new__的基础上可以完成一些其它初始化的动作 class Student(object):
def __init__(self,name):
self.name = name
print("这是__init__方法") def __new__(cls, *args, **kwargs):
print("这是__new__方法")
id =object.__new__(cls)
print(id) #打印这个__new__创建并返回的实例在内存中的地址
return id
s1 = Student("JACK")
print(s1)
'''
这是__new__方法
<__main__.Student object at 0x000001EC6C8C8748>
这是__init__方法
<__main__.Student object at 0x000001EC6C8C8748>
'''
总结:很明显,这两个实例的内存地址一样,所以__init__接受的实例就是__new__创建的。

3、__class__的使用:

实例调用__class__属性时指向该实例对应的类,所以_class__功能和type()函数一样,都是查看对象所在的类

class Student(object):
def __init__(self,name):
self.name = name
stu = Student("tom")
print(type(stu),type(Student))
print(stu.__class__, Student.__class__, stu.__class__.__class__)
'''结果如下:
<class '__main__.Student'> <class 'type'>
<class '__main__.Student'> <class 'type'> <class 'type'>

4、利用__class__可以找到对象的类,看一道面试题:

class A():
def show(self):
print('base show')
class B(A):
def show(self):
print('dic show')
如何调用A的show 方法:
obj=B()
obj.show() #对B类实例化,因为B类中有show方法,所以直接用obj.show()调用的是其自身的方法
obj
****结果*****
dic show
<__main__.B object at 0x00000000027EA9E8> #obj是B类的实例化对象
答案:
obj.__class__=A #__class__ 方法指向了类对象,只用给他赋值类型 A ,然后调用方法 show
obj.show()
obj
****结果*****
base show
<__main__.A object at 0x00000000027EA9E8> #这时候obj是A类的实例化对象
####注意,由于你对obj对象的类更改,在使用完后要通过 obj.__class__=B进行修改回来,避免后面调用方法错误

python 类中__init__,__new__,__class__的使用详解的更多相关文章

  1. 第8.6节 Python类中的__new__方法深入剖析:调用父类__new__方法参数的困惑

    上节<第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解>通过案例详细分析了两个方法的执行顺序,不知大家是否注意到了,在上述 ...

  2. Python中__init__.py文件的作用详解

    转自http://www.jb51.net/article/92863.htm Python中__init__.py文件的作用详解 http://www.jb51.net/article/86580. ...

  3. Python 类中__init__()方法中的形参与如何修改类中属性的值

    一.__init__()方法 如果__init__()方法为 class Cat(): def __init__(self,num) : self.num=num Python中类的__init__( ...

  4. 第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解

    上节介绍了__new__()方法这个比构造方法还重要的方法的语法,本节通过案例来详细剖析__new__()方法的细节以及它与构造方法之间的关系. 一.    案例说明 本节以圆Cir类为例来说明,为了 ...

  5. python 类中__init__函数的使用

    class F: def __init__(self): print('hello china') __init__ 是构造函数,初始化类,每当调用类的时候,就会自动执行这个函数 比如:执行 F() ...

  6. 第8章 Python类中常用的特殊变量和方法目录

    第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...

  7. Python类中super()和__init__()的关系

    Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...

  8. 【转】python类中super()和__init__()的区别

    [转]python类中super()和__init__()的区别 单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(se ...

  9. 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法

    第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一.    案例说明 本节定义了类Sta ...

随机推荐

  1. pta 编程题10 Root of AVL Tree

    其它pta数据结构编程题请参见:pta 这道题考察平衡二叉查找树的插入. 为了保证二叉查找树的平衡,当一个结点的左右子树的高度差大于1时就要进行调整. 分为以下四种情况: 插入新节点后,以及旋转之后, ...

  2. java Vamei快速教程04 封装和接口

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 总结之前的内容,对象(object)指代某一事物,类(class)指代象的类型.对 ...

  3. 【BZOJ1857】传送带(分治经典:三分套三分)

    点此看题面 大致题意: 一个二维平面上有两条传送带\(AB\)和\(CD\),\(AB\)传送带的移动速度为\(P\),\(CD\)传送带的移动速度为\(Q\),步行速度为\(R\),问你从\(A\) ...

  4. 使用OpenFileDialog组件打开对话框

    实现效果: 知识运用: OpenFileDialog组件的ShowDialog方法 public DialogResult Show () //返回枚举值 DialogRrsult.OK  或  Di ...

  5. 2018.6.10 Oracle数据库常见的错误汇总

    1.ClassNoFoundException 找不到注册驱动 可能原因:1>驱动名称不对 2>没有导入数据库驱动包 2.SQl 语句中可以使用任何有效的函数,函数操作的列,必须指定别名, ...

  6. SQL 值得记住的点

    概要 记录在学习过程中,遇到的不懂且需要掌握的知识点.主要基于 MySQL.   汇总      replace 函数      删除重复      取子串 substr      项连接      ...

  7. 在docker镜像中加入环境变量

    原文链接 前言 reference:https://vsupalov.com/docker-build-time-env-values/ 很多时候,我们需要在docker镜像中加入环境变量,本人了解的 ...

  8. java基础必备单词讲解 day one

    computer 电脑 computer path 路径 配置jdk环境 class 类 classpath 类路径 编译好的文件执行路径 public 公共的 private 私有的 static ...

  9. vue学习之路 - 1.初步感知

    一.安装 这里使用node的npm包管理工具进行操作.操作前请先下载node. 在工程文件夹中使用以下命令安装vue: npm install vue 如下图所示:我在 helloworld 文件夹中 ...

  10. AT2386 Colorful Hats (乱搞题,思维题)

    分情况讨论的神题... max不等于min + 1 或者不等于min,这种情况显然不存在. 如果都等于一个数 有两种情况: 互相独立,那么a[i]肯定==n-1 有相同的,那么a[i]一定不是独立的. ...