在python中,object是一个我们会经常遇到的词汇,那么这个词汇究竟有什么含义呢?通过查阅一些文档,我们发现,object其实是一个类的实例,而这个类的名字是Object(默认类的命名首字母大写),它是所有类的父类,换句话说,python是默认所有的类都继承自Object类。而如abc(抽象基类)等其他的内置的类都是基于Object类的一些功能实现的。可以说,Object类规定了类的结构,加载方式,常用函数等。对Object类的常见应用主要有以下两个形式,python2和python3
#以前的写法:
class ClsName(Object):
pass
#现在的写法:
class ClsName:
pass
可见,在python3中,如果有其他父类才编写,如果没有父类可以省掉Object类,python的编译器会默认继承Object类。
Object类规定了python用于类的内置函数,以下会简述几个比较常见的用法。
__new__(cls, *args, **kwargs)
创建对象时自动调用的函数,主要作用是创建对象,给该对象分配空间,方便之后的的操作。该函数会返回创建出来的对象实体,一旦正常的返回实体后,调用初始化函数
__init__(self)
初始化函数(构造函数),作用:给当前对象创建各类变量,并给变量赋初值,一般用于对象的初始设置,该函数没有返回值。
__str__(self)
对象描述函数,作用:返回当前对象的字符串类型的信息描述,一般用于对象的直接输出显示。
__del__(self)
删除该对象时会自动调用,一般用于工具型对象的资源回收。
__repr__(self)
类似__str__,只是该函数是面向解释器的。
__call__(self)
该方法的功能类似于在类中重载 () 运算符,使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用。
以下以一个例子展示:
class Student:
def __new__(cls, *args, **kwargs):
print("测试类的__new__方法")
return super().__new__(cls)
# 调用父类的创建对象的函数,进行当前对象的创建
def __init__(self, name, age, sex):
print("测试类的初始化函数__init__")
self.name = name
self.age = age
self.sex = sex
# 返回当前对象的字符串描述
def __str__(self):
print('测试类的__str__方法')
return "我是{},今年{}岁,是个{}的".format(
self.name,
self.age,
self.sex
)
def __del__(self):
print("测试类的__del__方法")
def __repr__(self):
print('测试类的__repr__方法')
return 'self.name: {}, self.age: {}, self.sex: {}.'.format(
self.name,
self.age,
self.sex
)
def __call__(self):
print('测试__call__方法默认输出self.name的值')
return self.name
用Python Shell进行测试:
stu1 = Student('张三', 20, '男')
测试类的__new__方法
测试类的初始化函数__init__
测试类的__del__方法
str(stu1)
测试类的__str__方法
'我是张三,今年20岁,是个男的'
repr(stu1)
测试类的__repr__方法
'self.name: 张三, self.age: 20, self.sex: 男.'
# 也可以用python内置的hasattr函数进行测试
hasattr(stu1,'__init__')
True
hasattr(stu1,'__repr__')
True
hasattr(stu1,'__call__')
True
a = stu1()
测试__call__方法默认输出self.name的值
a
'张三'
由此可见,在实例化一个类的时候,__new__,__init__,__del__方法会首先调用。然后通过str,repr函数分别调用__str__,__repr__方法的时候,相应的方法会得到调用。