Imooc - Python3 进阶教程: Python类的特殊方法
本章讲解Python的特殊方法,以及如何利用特殊方法定制类,实现各种强大的功能。
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
- 类,初始化
- 实例,即是一个方法,继续调用
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))