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. python3爬虫03(find_all用法等)

    #read1.html文件# <html><head><title>The Dormouse's story</title></head># ...

  2. GetIPAddress——获得本地IP地址信息

    1.gethostname()需要初始化套接字库 加载#pragma comment(lib,"ws2_32.lib"),和WSAStartup(MAKEWORD(2,2),&am ...

  3. UOJ#122【NOI2013】树的计数

    [NOI2013]树的计数 链接:http://uoj.ac/problem/122 按BFS序来,如果$B_i$与$B_{i-1}$必须在同一层,那么贡献为0,必须在不同层那么贡献为1,都可以贡献为 ...

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

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

  5. 同余问题(一)——扩展欧几里得exgcd

    前言 扩展欧几里得算法是一个很好的解决同余问题的算法,非常实用. 欧几里得算法 简介 欧几里得算法,又称辗转相除法. 主要用途 求最大公因数\(gcd\). 公式 \(gcd(a,b)=gcd(b,a ...

  6. Activiti学习记录(四)

    1 连线 注意:如果将流程图放置在和java类相同的路径,需要配置: 1.1 部署流程定义+启动流程实例 ProcessEngine processEngine = ProcessEngines.ge ...

  7. Object类和String类

    Object类 Object类是Java语言中的根类,即所有类的父类. equals方法 返回值类型为:boolean类型 用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较. 例子: ...

  8. SQL SERVER 2012数据库自动备份的方法

    SQL SERVER 2012数据库自动备份的方法 为了防止数据丢失,这里给大家介绍SQL SERVER2012数据自动备份的方法: 一.打开SQL SERVER 2012,如图所示: 服务器类型:数 ...

  9. Oracle Analyze

    Analyze使用场景 之前很多次都说到,对表的索引等信息进行了增删改之后,需要对表进行analyze更新统计信息,才能使数据库做出最好的执行计划,没有注意到,即使是一张很小的空表,如果进行了字段的增 ...

  10. Ubuntu 14.04 LTS 触摸板无法使用

    c16b上,触摸板不能使用,查找后发现,需要在加载驱动时增加参数. 如下所说: 1.使用以下命令后,触摸板可以使用 sudo modprobe -r psmouse sudo modprobe psm ...