类的定制
__str__
首先看個例子:
>>> class Student(object): ... def __init__(self, name): ... self.name = name ... >>> print(Student('Michael')) <__main__.Student object at 0x109afb190>這樣打印出的不好看, 給它定制一下:
>>> class Student(object): ... def __init__(self, name): ... self.name = name ... def __str__(self): ... return 'Student object (name: %s)' % self.name ... >>> print(Student('Michael')) Student object (name: Michael)如果不用print()打印,顯示的還是不好看:
>>> s = Student('Michael') >>> s <__main__.Student object at 0x109afb310>這是因為直接顯示調用 的不是__str__,而是__repr__(), 再定義一個__repr__()就行了,寫法跟__str__完全一樣。還有個簡單的寫法:
class Student(object):def __init__(self, name):self.name = namedef __str__(self):return 'Student object (name=%s)' % self.name__repr__ = __str____iter__
用類來實現肥波納妾, 并可以迭代:
class Fib(object):def __init__(self):self.a, self.b = 0, 1 # 初始化兩個計數器a,bdef __iter__(self):return self # 實例本身就是迭代對象,故返回自己def __next__(self):self.a, self.b = self.b, self.a + self.b # 計算下一個值if self.a > 100000: # 退出循環的條件raise StopIteration();return self.a # 返回下一個值?
__getattr__
如果調用一個不存在的屬性或方法,就會報錯; 想要實現當調用 一個不存在的方法或屬性時,給它返回自定義的內容。那就是再寫一個__getattr__()方法:
class Student(object):def __init__(self):self.name = 'Michael'def __getattr__(self, attr):if attr=='score':return 99>>> s = Student() >>> s.name 'Michael' >>> s.score 99如果我們調用其它的不存在的屬性時,則會返回None,因為我們定義的__getattr__() 返回的就是None, 所以我們可以讓__getattr__()響應特定屬性的請求,其它的拋出AttributeError錯誤
__call()__
當我們執行一個實例時,自動調用的方法:
class Student(object):def __init__(self, name):self.name = namedef __call__(self):print('My name is %s.' % self.name)>>> s = Student('Michael') >>> s() # self參數不要傳入 My name is Michael.這樣的調用方式和函數是一樣的,那我們要怎么區分一個變量是函數還是實例呢?
>>> callable(Student()) True >>> callable(max) True >>> callable([1, 2, 3]) False >>> callable(None) False >>> callable('str') False轉載于:https://www.cnblogs.com/huangxm/p/5723421.html
總結
- 上一篇: Java NIO vs IO
- 下一篇: Python学习笔记011_模块_标准库