在python中一切皆对象,所以在面向对象编程中,需要先创建实例,__new__方法负责创建实例对象,__init__负责给创建实例进行初始化,给实例化对象增加一些属性
new
- __new__在创建实例之前被调用,用以创建实例然后返回该实例对象,是个静态方法
- __new__必须要有返回值,就是返回创建的实例,也可以返回父类new出的实例或者是object的new出来的实例
- __new__返回值会传给__init__方法第一个参数self,然后__init__给该对象设置一些属性
- __new__至少要有一个参数cls,表示要实例化的类,此参数在实例化时由python解释器自动提供
- 自定义类中没有重写该方法,则Python自动调用父类的方法,当所有父类也没有重写定义该方法时,则直接调用object类的__new__方法
init
- __init__是实例对象创建完成后被调用,然后设置对象属性的一些初始值通常用在初始化一个实例的时候,是一个实例方法
- __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)