今天给大家分享python特制类的特殊方法
什么是特殊方法
特殊方法定义在calss中
不需要直接调用
Python的某些函数或操作符会调用对应的特殊方法
-1.1 str和__repr__
如果要把一个类的实例变成 str,就需要实现特殊方法str():
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender def __str__(self): return '(Person: %s, %s)' % (self.name, self.gender)
现在,在交互式命令行下用 print 试试:
>>> p = Person('Bob', 'male')>>> print p(Person: Bob, male) 但是,如果直接敲变量 p:>>> p
似乎str() 不会被调用。
因为 Python 定义了str()和repr()两种方法,str()用于显示给用户,而repr()用于显示给开发人员。
有一个偷懒的定义repr的方法:
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender def __str__(self): return '(Person: %s, %s)' % (self.name, self.gender) __repr__ = __str__
-1.2 cmp
对 int、str 等内置数据类型排序时,Python的 sorted() 按照默认的比较函数 cmp 排序,但是,如果对一组 Student 类的实例排序时,就必须提供我们自己的特殊方法 cmp():
class Student(object): def __init__(self, name, score): self.name = name self.score = score def __str__(self): return '(%s: %s)' % (self.name, self.score) __repr__ = __str__ def __cmp__(self, s): if self.name s.name: return 1 else: return 0
上述 Student 类实现了cmp()方法,cmp用实例自身self和传入的实例 s 进行比较,如果 self 应该排在前面,就返回 -1,如果 s 应该排在前面,就返回1,如果两者相当,返回 0。
Student类实现了按name进行排序:
>>> L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 77)]>>> print sorted(L) [(Alice: 77), (Bob: 88), (Tim: 99)]
注意: 如果list不仅仅包含 Student 类,则 cmp 可能会报错:
-1.3 len
如果一个类表现得像一个list,要获取有多少个元素,就得用 len() 函数。
要让 len() 函数工作正常,类必须提供一个特殊方法len(),它返回元素的个数。
例如,我们写一个 Students 类,把名字传进去:
class Students(object): def __init__(self, *args): self.names = args def __len__(self): return len(self.names)
只要正确实现了len()方法,就可以用len()函数返回Students实例的“长度”:
>>> ss = Students('Bob', 'Alice', 'Tim')>>> print len(ss)3
好了,今天就分享到这里,有想学习Python编程的伙伴们,欢迎留言和小编交流学习,最后祝大家早日成为Python大牛!
领取专属 10元无门槛券
私享最新 技术干货