国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python中實現定制類的特殊方法總結

2020-02-23 05:52:03
字體:
來源:轉載
供稿:網友

看到類似__slots__這種形如__xxx__的變量或者函數名就要注意,這些在Python中是有特殊用途的。

__slots__我們已經知道怎么用了,__len__()方法我們也知道是為了能讓class作用于len()函數。

除此之外,Python的class中還有許多這樣有特殊用途的函數,可以幫助我們定制類。

__str__

我們先定義一個Student類,打印一個實例:
代碼如下:
>>> class Student(object):
...     def __init__(self, name):
...         self.name = name
...
>>> print Student('Michael')
<__main__.Student object at 0x109afb190>

打印出一堆<__main__.Student object at 0x109afb190>,不好看。

怎么才能打印得好看呢?只需要定義好__str__()方法,返回一個好看的字符串就可以了:
代碼如下:
>>> 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__(),兩者的區別是__str__()返回用戶看到的字符串,而__repr__()返回程序開發者看到的字符串,也就是說,__repr__()是為調試服務的。

解決辦法是再定義一個__repr__()。但是通常__str__()和__repr__()代碼都是一樣的,所以,有個偷懶的寫法:
代碼如下:
class Student(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return 'Student object (name=%s)' % self.name
    __repr__ = __str__

__iter__

如果一個類想被用于for ... in循環,類似list或tuple那樣,就必須實現一個__iter__()方法,該方法返回一個迭代對象,然后,Python的for循環就會不斷調用該迭代對象的next()方法拿到循環的下一個值,直到遇到StopIteration錯誤時退出循環。

我們以斐波那契數列為例,寫一個Fib類,可以作用于for循環:
代碼如下:
class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1 # 初始化兩個計數器a,b

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿图什市| 托克逊县| 铁岭县| 咸阳市| 曲靖市| 谢通门县| 大理市| 福泉市| 崇信县| 云霄县| 太仓市| 阿拉善右旗| 建瓯市| 闽清县| 信宜市| 宜兴市| 乡宁县| 阜阳市| 宜丰县| 湖北省| 西华县| 农安县| 米脂县| 锦屏县| 江门市| 乌拉特后旗| 民和| 淄博市| 荆州市| 宜君县| 铁岭县| 梁山县| 仁怀市| 兰州市| 望谟县| 高青县| 沐川县| 四子王旗| 凤庆县| 崇明县| 沾益县|