Python_day09--面向对象(三)---魔术方法

一、构造器和析构器

__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)



猜你喜欢

转载自blog.csdn.net/biu_biu_0329/article/details/80419842
今日推荐