说明

Python 教程正在编写中,欢迎大家加微信 sinbam 提供意见、建议、纠错、催更。

Python 的类内置了一些通用的属性和方法,方便我们进行操作和对类的管理。我们可以使用dir(ClassName)来查看这些属性和方法,其中前后双下划线的如__dir__就是内置的。下边对一些常用的进行介绍,为了方便和美观省略了写前后双下划线。

在下例中,我们对类进行了实例化:

tom = Student('tome')
doc

__doc__ 可以返回类的介绍,这个介绍是我们之前在定义类时写的注释,帮助我们记住类的作用和使用方法,也可以写一些使用例子,我们接触三方库时,可以通过它查看它的介绍。

tom.__doc__
# '这是一个学生类'
new 和 ini

t

new 和 init 在类在实例化过程中都会被调用的方法,会先调用 new 函数再调用 init 函数。 __new__ 会创建对象,相当于构造器,起创建一个类实例的作用,__init__ 作为初始化器,负责对象的初始化。

new 的第一个参数是 cls 是类自身,init 是 self,是实例。一般情况下,我们很少需要自己编写 new,只需要关注 init 实例初始化。

new 是静态函数,init 是实例函数。如果,new 函数不返回实例对象,那么 init 函数就不会被调用:

class A(object):
def __new__(cls):
print("A.__new__ called")
# return super().__new__(cls)
def __init__(self):
print("A.__init__ called")
s = A()
print(s)
# A.__new__ called
# None
另外 init 函数只能返回 None,否则会引起 TypeError。参考
__init__ 方法可以用来做一些初始化工作,在上一节的例子中,学生类,要求传入学生的姓名和年龄。
class Student(object):
def __init__(self, a, b):
self.name = a
self.age = b
super(Student, self).__init__()
# 实例化
lily = Student('lily', 18)
call
__call__ 可以让实例对象像函数那样可被执行,callable(lily) 默认是不能被执行的,我们重写 call 。
class Student(object):
def __init__(self, a, b):
self.name = a
self.age = b
super(Student, self).__init__()
def __call__(self):
self.age += 1
print('我能执行了')
# 实例化
lily = Student('lily', 18)
callable(lily)
# True
lily()
# 我能执行了
lily.age
# 19
str 和 repr

两者的目的都是为了显式的显示对象的一些必要信息,方便查看和调试。也可以利用它们的特性来实现一些业务需求。str 被 print 默认调用,repr 被控制台输出时默认调用。即,使用 str 控制用户展示,使用 repr 控制调试展示。

class Student(object):
def __init__(self, a, b):
self.name = a
self.age = b
def __str__(self):
return f'姓名:{self.name},年龄:{self.age}'
# 实例化
lily = Student('lily', 18)
print(lily)
# 姓名:lily,年龄:18
其他属性和方法
dir(lily)
'''
['__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'age',
'name']
'''

其他

类还有以下方法:

# 类名称的字符
Student.__name__
# 'Student'