python內建方法之前六種
內建方法 | 說明 |
__init__(self,...) | 初始化物件,在建立新物件時呼叫 |
__del__(self) | 釋放物件,在物件被刪除之前呼叫 |
__new__(cls,*args,**kwd) | 例項的生成操作 |
__str__(self) | 在使用print語句時被呼叫 |
__getitem__(self,key) | 獲取序列的索引key對應的值,等價於seq[key] |
__len__(self) | 在呼叫行內函數len()時被呼叫 |
__cmp__(stc,dst) | 比較兩個物件src和dst |
__getattr__(s,name) | 獲取屬性的值 |
__setattr__(s,name,value) | 設定屬性的值 |
__delattr__(s,name) | 刪除name屬性 |
__getattribute__() | __getattribute__()功能與__getattr__()類似 |
__gt__(self,other) | 判斷self物件是否大於other物件 |
__lt__(slef,other) | 判斷self物件是否小於other物件 |
__ge__(slef,other) | 判斷self物件是否大於或者等於other物件 |
__le__(slef,other) | 判斷self物件是否小於或者等於other物件 |
__eq__(slef,other) | 判斷self物件是否等於other物件 |
__call__(self,*args) | 把例項物件作為函式呼叫 |
1. __init__():
class Person(object):
"""Silly Person"""
def __init__(self, name, age):
print '__init__'
if __name__ == '__main__':
letfly = Person('letfly', 22)
print letfly
輸出:
__init__
<__main__.Person object at 0x1062543d0>
複雜點:
class Person(object):
"""Silly Person"""
def __init__(self, name, age):
print '__init__'
self.name = name
self.age = age
def print1(self):
print 'print1'
return '<Person: %s(%s)>' % (self.name, self.age)
if __name__ == '__main__':
letfly = Person('letfly', 22)
print letfly.print1()
輸出:
__init__
print1
<Person: letfly(22)>
2. __del__():
# coding:utf-8
class Person(object):
"""Silly Person"""
all_count = 0 # 所有的例項都共享此變數,即不單獨為每個例項分配
print 'class members', all_count
def __init__(self, name, age):
self.name = name
self.age = age
Person.all_count += 1
print name, Person.all_count
def __del__(self):
print '__del__'
Person.all_count -= 1
print self.name, self.age, Person.all_count
if __name__ == '__main__':
letfly1 = Person("letfly1", 11)
letfly2 = Person("letfly2", 22)
輸出:// 先執行類成員變數
class members 0
letfly1 1
letfly2 2
<__main__.Person object at 0x10ba523d0> <__main__.Person object at 0x10ba76790>
__del__
Exception AttributeError: "'NoneType' object has no attribute 'all_count'" in <bound method Person.__del__ of <__main__.Person object at 0x10ba523d0>> ignored
__del__
Exception AttributeError: "'NoneType' object has no attribute 'all_count'" in <bound method Person.__del__ of <__main__.Person object at 0x10ba76790>> ignored
我們發現,全域性變數all_count析構前被刪除# coding:utf-8
class Person(object):
"""Silly Person"""
all_count = 0 # 所有的例項都共享此變數,即不單獨為每個例項分配
print 'class members', all_count
def __init__(self, name, age):
self.name = name
self.age = age
Person.all_count += 1
print name, Person.all_count
def __del__(self):
print '__del__'
Person.all_count -= 1
print self.name, self.age, Person.all_count
if __name__ == '__main__':
letfly1 = Person("letfly1", 11)
letfly2 = Person("letfly2", 22)
print '__letfly1__'
del letfly1
print '__letfly2__'
del letfly2
輸出:
class members 0
letfly1 1
letfly2 2
__letfly1__
__del__
letfly1 11 1
__letfly2__
__del__
letfly2 22 0
3. __new__():
執行順序:
class Person(object):
"""Silly Person"""
def __new__(cls):
print '__new__'
if __name__ == '__main__':
letfly = Person()
print letfly
輸出:// 沒有__init__也可以例項化
__new__
None
複雜點:
class Person(object):
"""Silly Person"""
def __new__(cls):
print '__new__'
a = super(Person, cls).__new__(cls)
print '__new__1'
if __name__ == '__main__':
letfly = Person()
print letfly
輸出:// 不return也可以super
__new__
__new__1
None
複雜點:
class Person(object):
"""Silly Person"""
def __new__(cls):
print '__new__'
a = super(Person, cls).__new__(cls)
print '__new__1'
def __init__(self, name, age):
print '__init__'
if __name__ == '__main__':
letfly = Person()
print letfly
輸出:// 不return不呼叫__init__
__new__
__new__1
None
複雜點:class Person(object):
"""Silly Person"""
def __new__(cls):
print '__new__'
a = super(Person, cls).__new__(cls)
print '__new__1'
return a
def __init__(self):
print '__init__'
if __name__ == '__main__':
letfly = Person()
print letfly
輸出:// return呼叫__init__
__new__
__new__1
__init__
<__main__.Person object at 0x10feea790>
複雜點:class Person(object):
"""Silly Person"""
def __new__(cls, name, age):
print '__new__'
return super(Person, cls).__new__(cls, name, age)
def __init__(self, name, age):
print '__init__'
self.name = name
self.age = age
def print1(self):
print 'print1'
return '<Person: %s(%s)>' % (self.name, self.age)
if __name__ == '__main__':
letfly = Person('letfly', 22)
print letfly.print1()
輸出:
__new__
__init__
print1
<Person: letfly(22)>
作用:
使用__init__實現abs()
class Person(object):
"""Silly Person"""
def __init__(self):
print '__init__'
super(Person, self).__init__()
if __name__ == '__main__':
letfly = Person()
print letfly
輸出:
__init__
<__main__.Person object at 0x1070273d0>
複雜點:class Person(int):
"""Silly Person"""
def __init__(self, age):
print '__init__'
super(Person, self).__init__(self, abs(age))
if __name__ == '__main__':
letfly = Person(-22)
print letfly
輸出:// 仍是原數
__init__
-22
使用__new__實現abs()class Person(int):
"""Silly Person"""
def __new__(self, age):
print '__new__'
return super(Person, self).__new__(self, abs(age))
if __name__ == '__main__':
letfly = Person(-22)
print letfly
輸出:// 需要return
__new__
22
實現單例
class Person(object):
"""Silly Person"""
def __init__(self):
print '__init__'
if __name__ == '__main__':
letfly1 = Person()
letfly2 = Person()
print letfly1 is letfly2
輸出:
__init__
__init__
False
使用__new__class Person(object):
"""Silly Person"""
def __new__(self):
print '__new__'
def __init__(self):
print '__init__'
if __name__ == '__main__':
letfly1 = Person()
letfly2 = Person()
print letfly1 is letfly2
輸出:// obj1和obj2同一個例項
__new__
__new__
True
4. __str__():
class Person(object):
"""Silly Person"""
def __new__(cls, name, age):
print '__new__'
return super(Person, cls).__new__(cls, name, age)
def __init__(self, name, age):
print '__init__'
self.name = name
self.age = age
def __str__(self):
print '__str__'
return '<Person: %s(%s)>' % (self.name, self.age)
if __name__ == '__main__':
letfly = Person('letfly', 22)
print letfly
輸出:
__new__
__init__
__str__
<Person: letfly(22)>
5. __getitem__
為什麼?類如果把某個屬性定義為陣列,可以使用__getitem__()輸出陣列中的某個元素。
# -*- coding: UTF-8 -*-
class Person(object):
"""Silly Person"""
def __new__(cls, name, age):
print '__new__'
return super(Person, cls).__new__(cls, name, age)
def __init__(self, name, age):
print '__init__'
self.name = name
self.age = age
def __getitem__(self, i):
print '__getitem__'
return self.books[i]
def __str__(self):
print '__str__'
return '<Person: %s(%s)>' % (self.name, self.age)
if __name__ == '__main__':
letfly = Person('letfly', 22)
letfly.books = ['datastruct', 'systerm']
print letfly.books
輸出:// 沒有輸出__getitem__
__new__
__init__
['datastruct', 'systerm']
複雜點class Person(object):
"""Silly Person"""
def __new__(cls, name, age):
print '__new__'
return super(Person, cls).__new__(cls, name, age)
def __init__(self, name, age):
print '__init__'
self.name = name
self.age = age
def __getitem__(self, i):
print '__getitem__'
return self.books[i]
def __str__(self):
print '__str__'
return '<Person: %s(%s)>' % (self.name, self.age)
if __name__ == '__main__':
letfly = Person('letfly', 22)
letfly.books = ['datastruct', 'systerm']
for iterm in letfly:
print iterm
輸出:// 輸出了三個__getitem__
__new__
__init__
__getitem__
datastruct
__getitem__
systerm
__getitem__
6. __len__
class Person(object):
"""Silly Person"""
def __new__(cls, name, age):
print '__new__'
return super(Person, cls).__new__(cls, name, age)
def __init__(self, name, age):
print '__init__'
self.name = name
self.age = age
def __getitem__(self, i):
print '__getitem__'
return self.books[i]
def __len__(self):
print '__len__'
return len(self.books)
def __str__(self):
print '__str__'
return '<Person: %s(%s)>' % (self.name, self.age)
if __name__ == '__main__':
letfly = Person('letfly', 22)
letfly.books = ['datastruct', 'systerm']
for iterm in letfly:
print iterm
print len(letfly)
輸出: // 要使用內建函式len(),而引數是Person的例項的時候,那一定要實現型別中的__len__()方法
__new__
__init__
__getitem__
datastruct
__getitem__
systerm
__getitem__
__len__
2
相關文章
- Python 內建方法Python
- python常用內建方法Python
- python內建方法APIPythonAPI
- Python 套接字內建方法Python
- 字串常用內建方法-python3字串Python
- python 字典內建方法get的使用Python
- 課時14:字串:各種奇葩的內建方法字串
- Python 的內建字串方法(收藏專用)Python字串
- Linux檢視內建命令和非內建命令幫助的幾種方法(man、help、info)Linux
- 2.1.2 Python物件導向之反射以及內建方法Python物件反射
- 專題:Python 的內建字串方法(收藏專用)Python字串
- 【建議收藏】五種方法教你python字串連線!Python字串
- Python繪製六種視覺化圖表詳解(建議收藏)Python視覺化
- python字典鍵的特性及字典內建函式&方法Python函式
- Python內建函式Python函式
- python 內建函式Python函式
- python兩種獲取剪貼簿內容的方法Python
- Python四種逐行讀取檔案內容的方法Python
- HTTP 協議六種請求方法HTTP協議
- 陣列去重的六種方法陣列
- 檢視mysql版本的六種方法MySql
- while迴圈補充、for迴圈、range關鍵字、內建方法之整型、內建方法之浮點型、內建方法之字串While字串
- Python基本語法_集合set/frozenset_內建方法詳解Python
- python 魔術方法 : 讓自定義類更像內建型別Python型別
- Python內建函式示例Python函式
- python常用內建函式Python函式
- 1.5.5 Python內建函式Python函式
- Python內建函式(一)Python函式
- Python內建函式(二)Python函式
- python內建小工具Python
- Python 內建函式大全Python函式
- python內建函式大全Python函式
- python 常用內建函式Python函式
- 提高mysql查詢效率的六種方法MySql
- 【python基礎】第11回 資料型別內建方法 02Python資料型別
- Python中,類的特殊方法與內建函式的關聯Python函式
- 【Python】python內建函式介紹Python函式
- 改善 Python 程式的 91 個建議(六)Python