Py定制类
特殊方法(魔术方法)
- 特殊方法定义在class中,不需要直接调用,Python的某些函数或操作符会自动调用对应的特殊方法。
str 在print打印时调用对象的str函数并打印返回值,repr是class中自带的方法,不需要声明,当直接打印类名是调用repr返回值。通常为保持一致,我们会令
__repr__=__str__
123456class Person(object):def __init__(self, name, gender):self.name = nameself.gender = genderdef __str__(self):return '(Person: %s, %s)' % (self.name, self.gender)len,只要正确实现了len()方法,就可以用len()函数返回实例的“长度”
12345class Students(object):def __init__(self, *args):self.names = argsdef __len__(self):return len(self.names)cmp,对 int、str 等内置数据类型排序时,Python的 sorted() 按照默认的比较函数 cmp 排序,但是,如果对一组 Student 类的实例排序时,就必须提供我们自己的特殊方法 cmp() ,注意return 1 表示交换位置。
123456789101112131415class Student(object):def __init__(self, name, score):self.name = nameself.score = scoredef __str__(self):return '(%s: %s)' % (self.name, self.score)__repr__ = __str__def __cmp__(self, s):if self.name < s.name:return -1elif self.name > s.name:return 1else:return 0@property举例说明
123456789101112class Student(object):def __init__(self, name, score):self.name = nameself.__score = score@propertydef score(self):return self.__score@score.setterdef score(self, score):if score < 0 or score > 100:raise ValueError('invalid score')self.__score = scoreslots,如果要限制添加的属性,例如,Student类只允许添加 name、gender和score 这3个属性,就可以利用Python的一个特殊的slots来实现。
123456class Student(object):__slots__ = ('name', 'gender', 'score')def __init__(self, name, gender, score):self.name = nameself.gender = genderself.score = scorecall,python中函数其实只是一个对象,它的不同之处在于可以被
()
操作符调用,执行()
操作符时候实际执行了call定义的代码块。12345678class Person(object):def __init__(self, name, gender):self.name = nameself.gender = genderdef __call__(self, friend):print 'My name is %s...' % self.nameprint 'My friend is %s...' % friend
注意:根据例子可以看出定制类中不同方法的使用还是存在明显差异的,大部分要求返回值,call只是定义需要执行的代码块。大部分特殊方法是在class中声明的,但是repr和slots很明显是class生来就有的,不需要声明,只做赋值即可。