常规:
__del__
魔术方法:
对象即将被释放的时候,会调用这个方法。注意如果这个对象产生了循环引用,并且实现了__del__方法,那么这个对象将得不到释放,从而产生内存泄漏。因此慎用这个方法。
__new__
魔术方法:
这个方法用来创建对象。如果想在创建对象的时候做些事情,那么可以重写这个方法。
__class__
魔术属性:
用来返回这个对象所属的类。如果一个类调用这个属性,那么得到的是这个类的元类。
__iter__
魔术方法:
返回一个迭代器。
__next__
魔术方法:
迭代器在被遍历的时候会每遍历一次调用这个方法(在Python3中,在Python2中使用的是next方法)
__str__
魔术方法:
- 在打印某个对象的时候,会调用这个对象的
__str__
方法,打印这个方法的返回值。
class Person(object):
def __init__(self,name):
self.name = name
p1 = Person('zhouxin')
print(p1)
# 打印出来的结果:
# <__main__.Person object at 0x008AD170>
而重写了__str__方法,那么打印出来的就是__str__的返回值:
class Person(object):
def __init__(self,name):
self.name = name
def __str__(self):
return 'Person<%s>' % self.name
p1 = Person('zhouxin')
print(p1)
# 打印出来的结果:
# Person<zhouxin>
- 如果在使用
str(obj)
这个函数的时候,也会调用__str__
方法。
__repr__
魔术方法:
__repr__
魔术方法是用来表述某个对象在内存中的展示形式- 如果在终端直接输入一个对象,然后按回车,那么将会执行这个对象的
__repr__
方法。 - 如果你将几个对象扔到一个容器中(比如:列表),那么你在打印这个容器的时候,会依次调用这个容器中的元素的
__repr__
方法。如果没有实现这个__repr__
方法,那么得到的将是一个类名+地址
的形式,这种形式的是不好理解的。
class Person(object):
def __init__(self,name):
self.name = name
def __repr__(self):
return "Person(%s)" % self.name
p1 = Person('zhouxin1')
p2 = Person('zhouxin2')
a = [p1,p2]
print(a)
# 打印的结果:
[Person(zhouxin1), Person(zhouxin2)]
__dict__
魔术属性:
- 用来获取用户自定义的属性,以及这个属性对应的值。返回的是一个字典。
- 和
dir
函数做一个区分。dir
函数返回的是这个对象上拥有的所有属性,包括Python
内置的属性和用户自己添加的,并且只是获取属性名字,不会获取这个属性对应的值。
比较:
__cmp__
魔术方法:
__cmp__(self,other)
这个方法在Python2
中可以正常使用。如果self
是大于other
的,那么应该返回正数,如果self
等于other
,那么应该返回0,如果self
小于other
,那么应该返回负数。
这个方法只能在Python2
中起作用,在Python3
中不再有用了。
class Person(object):
def __init__(self,name,age,height):
self.name = name
self.age = age
self.height = height
def __cmp__(self, other):
if self.age == other.age:
if self.height == self.height:
return 0
else:
return 1 if self.height > other.height else -1
return 1 if self.age > other.age else -1
__eq__(self,other)
:
比较两个对象是否相等,如果相等,那么返回True
,否则返回Flase
class Person(object):
def __init__(self,name,age,height):
self.name = name
self.age = age
self.height = height
def __eq__(self, other):
# self == other
if self.age == other.age:
if self.height == other.height:
return True
else:
return True if self.height == other.height else False
__ne__(self,other)
:
如果两个对象不想等,那么返回True,否则返回Flase
class Person(object):
def __init__(self,name,age,height):
self