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 ...
随机推荐
- windows 10 开启安卓模拟器蓝屏
上周装了个vs2017 rc 本想试试 开发安卓怎么样,花了一晚上时间终于装好了. 第二天开夜神模拟器的时候蓝屏了.. 然后就逐个卸载VS2017的功能,先是卸了 自带的仿真程序,没用.然后全部卸载掉 ...
- oc语言基础整理
objc.h---------------- typedef struct objc_class *Class; struct objc_object { Class isa OBJC_ISA_AV ...
- 2018.5.28 Oracle数据库补充
select * from (select rownum rn,e2.* from (select e1.* from emp e1)e2 where rownum<=10)e3 where e ...
- javascrit中“字符串为什么可以调用成员”
<script> var title = "this is title"; console.log(title.substr(0,5)); //字符串为什么可以调用 ...
- java 实现猜数字游戏 随机给定一个数字,猜大小直到正确
package com.swift; import java.util.Random; import java.util.Scanner; public class GuessBigSmall { p ...
- BZOJ1093: [ZJOI2007]最大半连通子图(tarjan dp)
题意 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G' ...
- git线上线下冲突
今天用git pull来更新代码,遇到了下面的问题: error: Your local changes to the following files would be overwritten by ...
- Spring中注解大全和应用
@Controller@RestController:@Service@Autowired@RequestMapping@RequestParam@ModelAttribute@Cacheable@C ...
- tp3.2框架中使用volist输出混乱的一点发现
在tp框架中,volist真的是一样很好用的东西,但是要是不注意,用起来也会有问题的 在Controller层中,将数据assign到页面 $this->assign('vo',$news); ...
- 在Ubuntu下配置jdk+maven
1.在官网上下载对应Linux版本的jdk 2.在终端输入命令将下载好的jdk解压并且转移到指定的路径如:首先执行 tar -zxvf jdk-8u181-linux-x64.tar.gz 然后 ...