python 类中__init__,__new__,__class__的使用详解
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__的使用详解的更多相关文章
- 第8.6节 Python类中的__new__方法深入剖析:调用父类__new__方法参数的困惑
上节<第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解>通过案例详细分析了两个方法的执行顺序,不知大家是否注意到了,在上述 ...
- Python中__init__.py文件的作用详解
转自http://www.jb51.net/article/92863.htm Python中__init__.py文件的作用详解 http://www.jb51.net/article/86580. ...
- Python 类中__init__()方法中的形参与如何修改类中属性的值
一.__init__()方法 如果__init__()方法为 class Cat(): def __init__(self,num) : self.num=num Python中类的__init__( ...
- 第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解
上节介绍了__new__()方法这个比构造方法还重要的方法的语法,本节通过案例来详细剖析__new__()方法的细节以及它与构造方法之间的关系. 一. 案例说明 本节以圆Cir类为例来说明,为了 ...
- python 类中__init__函数的使用
class F: def __init__(self): print('hello china') __init__ 是构造函数,初始化类,每当调用类的时候,就会自动执行这个函数 比如:执行 F() ...
- 第8章 Python类中常用的特殊变量和方法目录
第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...
- Python类中super()和__init__()的关系
Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...
- 【转】python类中super()和__init__()的区别
[转]python类中super()和__init__()的区别 单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(se ...
- 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法
第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一. 案例说明 本节定义了类Sta ...
随机推荐
- 利用binlog2sql解析mysqlbinlog row行日志
binlog2sql 项目作者:曹单锋 github项目地址:https://github.com/danfengcao/binlog2sql 也可在github.com上搜索“binlog2sql” ...
- java Vamei快速教程02 方法和数据成员
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在Java基础01 从HelloWorld到面向对象,我们初步了解了对象(obje ...
- 使用SAP云平台的destination消费Internet上的OData service
通过SAP云平台上的destination我们可以消费Internet上的OData service或者其他通过HTTP方式暴露出来的服务. 创建一个新的destination: 维护如下属性: 点击 ...
- POJ2112 Optimal Milking---二分+Floyd+网络流
题目链接: https://vjudge.net/problem/POJ-2112 题目大意: k个机器,每个机器最多服务m头牛. c头牛,每个牛需要1台机器来服务. 告诉你牛与机器每个之间的直接距离 ...
- 【BZOJ2049】[SDOI2008] Cave 洞穴勘测(LCT维护连通性)
点此看题面 大致题意: 有\(n\)个洞穴,\(3\)种操作:连一条边,删一条边,询问两点是否联通. \(LCT\)维护连通性 这道题应该是\(LCT\)动态维护连通性的一道模板题. 考虑将\(x\) ...
- js 封装父页面子页面交互接口
定义标准接口 Interface= {}; Interface.ParentWin = {}; Interface.ChildWin = {}; /** * 父页面提供的标准接口函数名称 */ Int ...
- C++unsigned char和char区别
char和unsigned charchar与unsigned char都是一个字节8bit,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char( ...
- 第29题:LeetCode54:Spiral Matrix螺旋矩阵
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ...
- 【Django】Django中datetime的处理(strftime/strptime)
strftime<将date,datetime,timezone.now()类型处理转化为字符串类型> strftime()函数是用来格式化一个日期.日期时间和时间的函数,支持date.d ...
- iftop工具指令选项记录
iftop是实时监控网卡流量的工具,功能十分强大,指令选项非常多,用法比较复杂,下面记录一下命令的选择作用 相关参数及说明 1.iftop界面相关说明 界面上面显示的是类似刻度尺的刻度范围,为显示流量 ...