python 深刻理解python __init__,__new__,__del__基本概念和用法

在python中一切皆对象,所以在面向对象编程中,需要先创建实例,__new__方法负责创建实例对象,__init__负责给创建实例进行初始化,给实例化对象增加一些属性

new

  1. __new__在创建实例之前被调用,用以创建实例然后返回该实例对象,是个静态方法
  2. __new__必须要有返回值,就是返回创建的实例,也可以返回父类new出的实例或者是object的new出来的实例
  3. __new__返回值会传给__init__方法第一个参数self,然后__init__给该对象设置一些属性
  4. __new__至少要有一个参数cls,表示要实例化的类,此参数在实例化时由python解释器自动提供
  5. 自定义类中没有重写该方法,则Python自动调用父类的方法,当所有父类也没有重写定义该方法时,则直接调用object类的__new__方法

init

  1. __init__是实例对象创建完成后被调用,然后设置对象属性的一些初始值通常用在初始化一个实例的时候,是一个实例方法
  2. __init__的参数self就是__new__返回的实例,__init__在__new__的基础上可以完成一些其他初始化的操作,__init__不需要返回值
class New(object)
   def __new__(cls,*args, **kwargs):
   		obj = object.__new__(cls,*args, **kwargs)  # obj是创建的实例
   		return obj
   	
   	def __init__(self,name):
   		self.name = name 
   	def test(self):
   		print("哈哈哈")  
   
n = New('胡图')  # 此处n为对象
print(n.name)

 		 
此处的self就是n这个对象,self并不是关键字,可以把self换成其他名称,
但是一般不换这是约定俗成的,但是要注意self一定要放在函数的第一个位置上,
self才表示你用这个类创建的对象,如果其他参数放在第一个位置上,
那么这个参数就成了self,即类中第一个参数才表示是你创建的实例对象。
2:self只有在类里面的函数(方法)中才有的,独立的函数不必带有self,
self是定义类方法时必须有的,虽然在调用时不必传入相应的参数

构造函数和析构函数
python中有两个特殊的方法,构造函数和析构函数
去面试的时候就碰到这个问题,现拿出来说一下

构造函数__new__
1.如果问你python中类的构造函数是什么?肯定很多人脱口而出是__init__,要这样回答就尴尬了。因为python当中__init__并不是构造函数,new__才是,听到这个是有点蒙的,因为一直是把__init__方法当作构造函数来使用的
2.回顾上面提到的,在调用__init__之前,我们的实例是已经被创建好了的,创建这个实例的方法就是__new
,而__init__只是初始化方法,给这个实例赋了值
一般都不会重构这个函数,而是使用Python提供的默认构造函数

析构函数__del__
1.当使用del删除对象时,会调用它本身的构析函数,另外当对象在某个作用域中调用完毕,在跳出其作用域的同时析构函数也会被调用一次,这样可以用来释放内存空间也就是实例被销毁的时候执行的

下面引用一个案例:
import pymysql
class Mydb(object):
    def __del__(self):
        # 构析函数
        self.cur.close()
        self.coon.close()
    def __init__(self,host,user,passwd,db,port=3306,charset='utf8'):
        try:
            # 此处获取数据库连接对象
            self.coon = pymysql.connect(host=host,user=user,passwd=passwd,port=port,charset=charset,db=db,autocommit=True)
        except Exception as e:
            print("数据库连接失败!%s" % e)
        else:
            # 设置cursor=pymysql.cursors.DictCursor  查询的结果以字典的形式返回  self.coon.cursor 游标
            self.cur = self.coon.cursor(cursor=pymysql.cursors.DictCursor)
    def query_sql(self,sql):
        try:
            # 执行sql语句
            self.cur.execute(sql)
        except Exception as e:
            print("sql语句有问题!%s" % e)
        else:
            self.res = self.cur.fetchall()
            return self.res
if __name__ == '__main__':
    info = Mydb('127.0.0.1','用户名','密码','数据库名')
    infos = info.query_sql('select id, project, branch, filename from gerrit_reviewer')
    print(infos)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

季布,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值