一、构造器和析构器
__init__(self[, ...])构造器,当一个实例被创建的时候调用的初始化方法
__del__(self)析构器,当一个实例被销毁的时候调用的方法
每个人都知道一个最基本的魔术方法,__init__。通过此方法我们可以定义一个对象的初始操作。然而,当我调用x = Student() 的时候, __init__ 并不是第一个被调用的方法。实际上,还有一个叫做 __new__ 的方法,来构造这个实例。然后给在开始创建时候的初始化函数来传递参数。在对象生命周期的另一端,也有一个 __del__ 方法
class OpenFile(object):
def __init__(self, filename, mode):
print("file is opening.......")
self.f = open(filename, mode)
def closed(self):
return self.f.closed
def __del__(self):
# 程序执行结束....
self.f.close()
print("file is deleteing.....", self.f.closed)
f = OpenFile('/etc/passwd', 'r')
print(f.closed())
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
print("student is create")
def __str__(self):
return "Student:<%s,%s,%s>" %(self.name, self.age, self.score)
def __del__(self):
print("student is delete")
s1 = Student("yutao", 19, 100)
print(s1)
二、__str__函数
__str__(self)函数用于处理打印实例本身的时候的输出内容。如果没有覆写该函数,则默认输出一个对象名称和内存地址。
例如:
class Student(object):
def __init__(self,name,age):
self.name = name
self.age = age
s1 = Student('yutao',18)
print(s1)
结果为一个地址;
当我们使用__str__内置函数时,则:
class Student(object):
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return 'I am %s'%(self.name)
s1 = Student('yutao',18)
print(s1)
输出结果就是:I am yutao
我们将str()
函数作用于该对象的时候,其实是调用了该对象的__str__
函数。
三、用于比较的魔术方法
__eq__(self, other) 定义了等号的行为, == 。
__ne__(self, other) 定义了不等号的行为, != 。
__lt__(self, other) 定义了小于号的行为, < 。
__gt__(self, other) 定义了大于等于号的行为, > 。
__le__(self,other)定义了小于等于的行为,<=
__ge__(self,other)定义了大于等于的行为,>=
但是在我们定义比较类时,不需要全部定义在类中,我们只需要知道__gt__和__eq__就可以为我们比较数值的大小
import functools
# 如果比较两个对象时, 只需要写>,=(<,=),
# 其他的比较方法装饰器自动根据已有的比较方法实现;
@functools.total_ordering
class Student(object):
def __init__(self, name, score=(100, 90, 100)):
self.name = name
self.scores = list(score)
def __iter__(self): #该方法需要返回一个迭代器(iterator)。
# 迭代学生对象时,默认迭代分数
return iter(self.scores) # list([1,2,3])
def __gt__(self, other): # other:也是一个对象
# s1>s2
avg_score1 = sum(self.scores) / len(self.scores)
avg_score2 = sum(other.scores) / len(other.scores)
return avg_score1 > avg_score2
def __eq__(self, other):
# s1=s2
avg_score1 = sum(self.scores) / len(self.scores)
avg_score2 = sum(other.scores) / len(other.scores)
return avg_score1 == avg_score2
s1 = Student("李四", [100, 100, 100])
s2 = Student("张三", [100, 100, 100])
print(s1 <= s2)
print(s1 >= s2)
print(s1 > s2)
print(s1 < s2)
print(s1 == s2)
上面的结果很好的为我们展示了结果。
四、__getitem__
1.__getitem__的简单用法:
当一个类中定义了__getitem__方法,那么它的实例对象便拥有了通过下标来索引的能力。
2、____setitem__(self,key,value):设置给定键的值
3、__delitem__(self,key):删除给定键对应的元素。
4、__len__():返回元素的数量
class Student(object):
def __init__(self, name, score):
self.name = name
self.scores = list(score)
def __getitem__(self, index):
return self.scores[index]
def __setitem__(self, index, value):
self.scores[index] = value
def __delitem__(self, index):
del self.scores[index]
s1 = Student("张三", [100, 90, 80])
s2 = Student("李四", [100, 100, 100])
print(s1[1:])
s1[1:] = [1,1]
print(s1.scores)