Imooc - Python3 进阶教程: Python类的特殊方法

本章讲解Python的特殊方法,以及如何利用特殊方法定制类,实现各种强大的功能。
更新于: 2022-01-13 02:55:51

Python类的__str____repr__方法

Python 定义了__str()__和__repr__()两种方法,__str()__用于显示给用户,而__repr__()用于显示给开发人员,当使用str()时,实际调用的是__str__()方法,而直接输入变量,调用的是__repr__()方法

num = 12
str(num) # ==> '12'
d = {1: 1, 2: 2}
str(d) # ==> '{1: 1, 2: 2}'
l = [1,2,3,4,5]
str(l) # ==> '[1, 2, 3, 4, 5]'

# 默认的 __str__
class Person:
    pass

bob = Person()
str(bob) # ==> '<__main__.Person object at 0x7fc77b859c50>'

# 定义了 __str__ 方法的情况
class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
    def __str__(self):
        return '-'.join([self.name, self.gender]) 

aric = Person("aric", 'maile')
print(str(aric))			# aric-maile

__len__ 方法

想使用len()函数来获取元素个数时,则需要实现__len__()方法

class Class:
    def __init__(self, students):
        self.students = students
    def __len__(self):
        return len(self.students)

students = ['Alice', 'Bob', 'Candy']
class_ = Class(students)
len(class_) # ==> 3

类的数学运算

事实上,Python很多的操作都是通过内建函数来实现的,比如最熟悉的加减乘除,都是通过内建函数来实现的,分别是

__add__、__sub__、__mul__、

__truediv__ 普通除法

__floordiv__ 对应的 地板除法

Python类的__slots__方法

限制动态的添加方法,成员

__slots__的目的是限制当前类所能拥有的属性,避免因为外部属性的操作导致类属性越来越难以管理。

class Student(object):
    __slots__ = ('name', 'gender', 'score')
    def __init__(self, name, gender, score):
        self.name = name
        self.gender = gender
        self.score = score
>>> student = Student('Bob', 'Male', 99)
>>> student.age = 12 # ==> 动态添加年龄age属性
Traceback (most recent call last):
AttributeError: 'Student' object has no attribute 'age'

Python类的__call__方法

将实例变成一个可调用的方法,类似于js 的 curry

  1. 类,初始化
  2. 实例,即是一个方法,继续调用
class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

    def __call__(self, friend):
        print('My name is {}...'.format(self.name))
        print('My friend is {}...'.format(friend))

参考