1.改变对象的字符串显示
重载__str__ , __repr__方法,当打印对象或者将对象转换为字符串的时候,会自动调用这些重载的方法。打印操作会首先尝试__str__和str内置函数,当__str__没有定义时,会调用__repr__.
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return "Point({0},{1})".format(self.x, self.y)
def __str__(self):
return "({0},{1})".format(self.x, self.y)
2.实现__enter__, __exit__来使对象支持上下文管理协议。当出现在with语句中的时候,__enter__方法被触发,返回的对象被赋值为as语句声明的对象,然后执行with语句块中的内容。最后触发__exit__方法执行清理工作
3.使用_ 和__来实现python的伪私有属性
4.通过给类添加__slots__属性来极大的减少实例所占的内存
class Person(object):
__slots__=['name', 'age']
def __init__(self, name, age):
self.name = name
self.age = age
5.使用property来管理类属性
特性协议允许我们把一个特定属性的get和set操作指向我们所提供的函数或方法,使得我们能够插入在属性操作时自动运行的代码.一个property属性实际上就是一系列相关绑定方法的集合
class Person(object):
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, name):
if not isinstance(value, str):
raise TypeError('need a string')
self._name = value
@name.deleter
def name(self):
del self._name
class Person(object):
def __init__(self, name):
self._name = name
def getName(self):
return self._name
def setName(self,value):
if not isinstance(value, str):
raise TypeError('need a string')
def delName(self):
del self._name
name = property(getName, setName, delName)
这两种方法达到的效果一样
6.调用父类方法 super
通过 D.__mro__ 可以查看D的继承列表
class A(object):
def __init__(self):
print "A.__init__"
class B(A):
def __init__(self):
super(B, self).__init__()
print "B.__init__"
class C(A):
def __init__(self):
super(C, self).__init__()
print "C.__init__"
class D(B,C):
def __init__(self):
super(D, self).__init__()
print "D.__init__"
d = D()
A.__init__
C.__init__
B.__init__
D.__init__
print D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)