Anders Wang


我所认识的每个人都是榜样,都有值得我去尊敬和学习的地方。


Python的魔术方法(Magic Method)

在Python中,我们时常会用到对象,而对象又包含许多方法,尤其是一些内置的方法都以"__"双下划线开头和结束,而这些方法在Python中都被统称为Magic Method,即魔术方法。

在魔术方法中比较常见和多用的一个方法就是__init__,它可以根据类的定义以及传入的参数对之后实例化的对象进行初始化。所以使用魔术方法最大的优势可以自定义的使用Python内置方法去达到某些功能。

举几个魔术方法使用例子:

_str_(self)

_str_(self)方法是用于处理打印实例对象本身的输出内容。可以看到,如果我们没有定义该方法直接使用print()方法输出时,输出的是对象的内存地址信息。

class Teacher:  
    def __init__(self, name):
        self.name = name


teacher1 = Teacher('Anders')  
print(teacher1)

# 输出如下:
# <__main__.Teacher object at 0x1083cf6a0>

下面的例子中我们定义了_str_ 方法,因为前面提到 __str__方法是处理打印实例本身的输出内容,所以这里直接在__str__方法中输出要想要输出的内容。

class Teacher:  
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return "I am a teacher, my name is {0}".format(self.name)

teacher1 = Teacher('Anders')  
print(teacher1)

# 输出如下:
# I am a teacher, my name is Anders

_eq_(self, other)

_eq_(self, other)方法是一个用于比较类型的魔术方法,这里用于比较是否相等的性质行为,除此以外还有 __ne__(self, other),__lt__(self, other),__gt__(self, other),__le__(self, other),__ge__(self, other)方法。

class Word:  
    def __init__(self, text):
        self.text = text

    def __eq__(self, other):
        return self.text.lower() == other.text.lower()

first = Word('anders')  
second = Word('ANDERS')  
# 当开始使用==号比较的时候,会把等于号右侧的实例对象传递给之前定义的__eq__的other参数
first == second

# 输出如下:
# True

_truediv_(self, other)

_truediv_(self, other)方法是一个和数学相关的魔术方法,

我们都知道我们可以把字符串直接乘以指定的数字,以此快捷方式得到对应所乘数倍数的字符串值。

"abc"*5

# 输出如下:
# 'abcabcabcabcabc'

但是如果你把一个字符串去除以指定的倍数那可是会直接报错的。

'abcabcabcabcabc'/5

# 输出如下:
# TypeError: unsupported operand type(s) for /: 'str' and 'int'

但现在有了魔术方法,我们就可以自定义自己的除法方法让表达式变的就像使用python自带方法那样的功能。

class Word():  
    def __init__(self, text):
        self.text = text

    def __truediv__(self, other):
        # 通过len()方法计算传入的对象字符串总长度,然后除以指定的整数,如果能整除才开始下一步判断,否则输出None
        if len(self.text) % other == 0:
            # 计算可以被分成多少组
            group = len(self.text) // other
            start = 0
            end = other
            l = []
            # 可以被分成多少组就循环多少次
            for i in range(group):
                # 用切片方式每次取开头到结束位置
                l.append(self.text[start:end])
                # 之后的开始位置就是上一次的结束位置
                start = end
                # 结束位置就等于开始的位置加上指定除以的整数(也就是要整除分组的每组数量值)
                end = start + other
            return l
        else:
            return "None"


    def __str__(self):
        return self.text

    def __repr__(self):
        return self.text

str1 = Word('abcabcabcabcabc')  
str1 / 3

# 输出如下:
# ['abc', 'abc', 'abc', 'abc', 'abc']

str1 / 4

# 输出如下:
# 'None'

最后要说的是,Python的魔术方法非常多,有用于表的魔术方法,有用于普通算数操作的魔术方法,有类型转换的魔术方法等等,这里就不一一例举,在明白了魔术方法的意义和用法后,需要的时候直接去查询魔术列表然后查看具体使用方法和传参就可以做到举一反三了。

最近的文章

使用setdefault方法处理字典缺失值

在处理字典集合的时候经常会去访问字典的键,由于场景有很多种比如有时候访问的字典键并不存在,那么如何很好的处理缺失值呢,这里要提到的就是字典的setdefault()方法,setdefault()方法其…

Python, 技术博文详细阅读
更早的文章

Python读取数据编码排错

在Python开发中,当需要读取某些数据文件或者获取某些数据时,很有可能会遇到因为编码不匹配而报错的情况。这类问题其实非常常见,主要原因,还是因为没有选择正确的编码来识别所导致的。 为了很好的说…

Python, 技术博文详细阅读
comments powered by Disqus