支持用于生成对象其他表示形式的内置函数(repr(),bytes())
repr()和str()都是返回对象的字符串形式。
class test():
typecode = 'd'
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
name = 'repr is change'
return name
我们可以在一个定义类里实现repr方法
v = test(3,4)
repr(v)
Out[12]: 'repr is change'
还有__bool__,__abs__,__eq__,__str__进行重载,记得要注意在文档中说明
下面看看classmethod,staticmethod的方法
class test2():
@classmethod
def a(*args):
return args
@staticmethod
def b(*args):
return args
test2.a()
Out[15]: (__main__.test2,)
test2.b()
Out[16]: ()
我们可以注意到classmethod改变了调用方法的形式,类方法传入的第一个参数是类本身,可以使用这个类重新构建一个实例
staticmethod呢,就是一个函数,只不过恰巧出现在了类里面而已,第一个参数就不是实例本身了
类的私有属性
class test3():
def _a(*args):
print(args)
在方法前面加一个_便是这个方法受到保护,但实际上你还是可以访问的,只要这样test._a(),这只是告诉后来人这个方法私有,不是你真的不可以访问了。
class test3():
def __a(*args):
print(args)
加两个下划线,python会使用名称改写,从而将这个方法保护起来,例如
dir(test3)
Out[26]:
['__class__',
...
'_test3__a']
方法名称会加上_类名。
此外,__slots__来存储你所想写的实例属性,这样就不需要python的__dict__方法消耗大量内存存储实例属性
class test4():
__slots__ = ('a', 'b')
dir(test4)
Out[28]:
['__class__',
'__delattr__',
...
'a',
'b']
但是注意,如果使用了__slots__,这样的话,每个子类都要定义__slots__,否则解释器就会忽略继承的__slots__
实例就只能调用__slots__列出的属性