python类的专有方法_Python——类的专有方法
Python除了自定義私有變量和方法外,還可以定義專有方法。專有方法是在特殊情況下或使用特殊語法時由python調用的,而不是像普通方法一樣在代碼中直接調用。看到形如__XXX__的變量或函數名時就需要注意下,這在python中是有特殊用途的
__init__ :?構造函數,在生成對象時調用
__del__ :?析構函數,釋放對象時使用
__repr__ :?打印,轉換
__setitem__ :?按照索引賦值
__getitem__:?按照索引獲取值
__len__:?獲得長度
__cmp__:?比較運算
__call__:?函數調用
__add__:?加運算
__sub__:?減運算
__mul__:?乘運算
__div__:?除運算
__mod__:?求余運算
__pow__:?乘方
1. __str__
定義一個 Student 類:
class Student(object):
def __init__(self, name):
self.name = name
print(Student('zth'))
執行結果:
1、由上面代碼可以看出如果直接輸出一個類的實例的話,得到的是一個特殊的字符串(程序開發者所用的)
2、如果要把一個類的實例變成str,就需要實現特殊方法__str__( )方法
3、__str__方法必須要return一個字符串類型的返回值,作為對實例對象的字符串描述
class Student(object):
def __init__(self, name):
self.name = name
def __str__(self):
return "學生的姓名:%s"%self.name
print(Student('zth'))
執行結果:
學生的姓名:zth
交互模式下:
>>> class Student(object):
... def __init__(self, name):
... self.name = name
...
... def __str__(self):
... return "學生的姓名:%s"%self.name
...
>>>
>>> print(Student('zth'))
學生的姓名:zth
>>>
>>> s = Student('zth')
>>>
>>> s
>>>
>>> print(s)
學生的姓名:zth
原因是直接顯示變量調用的不是? __str__() ,而是 __repr__(),兩者的區別在于__str__() 返回用戶看到的字符串,而 __repr__() 返回程序開發者看到的字符串。也就是__repr__() 是為調試服務的。
解決辦法是再定義一個__repr__。通常__str__() 和 __repr__() 代碼是一樣的,可以如下簡寫:
>>> class Student(object):
... def __init__(self, name):
... self.name = name
...
... def __str__(self):
... return "學生的姓名:%s"%self.name
...
... __repr__ = __str__
...
>>>
>>> s = Student('zth')
>>>
>>> s
學生的姓名:zth
2. __iter__
如果想要將一個類用于 for?... in 循環,類似 list 或 tuple 一樣,就必須實現一個__iter__()? 方法。該方法返回一個迭代對象,Python 的 for? 循環會不斷調用該迭代對象的? __next__()? 方法,獲得循環的下一個值,直到遇到 StopIteration 錯誤時退出循環。
如下:一個作用于 for 循環的斐波那契數列類:
class Fib(object):
def __init__(self):
self.a , self.b = 0,1 # 初始化兩個計數器 a、b
def __iter__(self):
return self # 實例本身就是迭代對象。故返回自己
def __next__(self):
self.a ,self.b = self.b ,self.a+self.b # 計算下一個值
if self.a > 100: # 退出循環的條件
raise StopIteration();
return self.a # 返回下一值
for n in Fib():
print(n)
執行結果:
1
1
2
3
5
8
13
21
34
55
89
3. __getitem__
Fib 實例雖然能夠作用于 for 循環,和 list 有點像,但是不能將它當成 list 使用。比如取第3個元素:
>>> Fib()[3]
Traceback (most recent call last):
File "", line 1, in TypeError: 'Fib' object does not support indexing
若要像list一樣按照索引來獲取元素,需要實現__getitem__()方法
>>> class Fib(object):
... def __getitem__(self,n):
... a = 0
... b = 1
... for x in range(n):
... a,b = b , a+b
... return a
...
>>>
>>> fib = Fib()
>>>
>>> fib[3]
2
>>>
>>> fib[5]
5
4. __getattr__
正常情況下,調用類的方法或屬性時,如果類的方法或屬性不存在就會報錯。
定義Student類:
>>> class Student(object):
... def __init__(self):
... self.name = 'zth'
...
>>>
>>> s = Student()
>>>
>>> s.name
'zth'
>>>
>>> s.age
Traceback (most recent call last):
File "", line 1, in AttributeError: 'Student' object has no attribute 'age'
要避免這個錯誤,除了可以添加一個score屬性外,Python還提供了另一種機制,就是寫一個__getattr__()方法,動態返回一個屬性。
>>> class Student:
... def __init__(self):
... self.name = 'zth'
... def __getattr__(self,attr):
... if attr == 'age':
... return 20
...
>>>
>>> s = Student()
>>>
>>> s.name
'zth'
>>> s.age
20
注意,只有在沒有找到屬性的情況下才調用__getattr__,已有的屬性(如name),不會在__getattr__中查找。此外,如果所有調用都會返回None(如stu.abc),就是定義的__getattr__,返回None。
5. __call__
一個對象實例可以有自己的屬性和方法,調用實例的方法時使用? instance.method()? 調用。能不能直接在實例本身調用,答案是可以的。
任何類,只需要定義一個__call__()方法,就可以直接對實例進行調用
>>> class Student:
... def __init__(self,name):
... self.name = name
... def __call__(self):
... print('姓名:%s'%self.name)
...
>>>
>>> s = Student('zth')
>>>
>>> s()
姓名:zth
__call__() 還可以定義參數。對實例進行直接調用就像對一個函數調用一樣,完全可以把對象看成函數,把函數看成對象,因為這兩者本來就是有根本的區別。
如果把對象看成函數,函數本身就可以在運行期間動態創建出來,因為類的實例都是運行期間創建出來的。
怎判斷一個變量是對象還是函數呢?
很多時候判斷一個對象能否被調用,可以使用Callable()函數,比如函數和上面定義帶有__call__()的類實例。
>>> callable(Student('zth'))
True
>>>
>>> callable(max)
True
>>>
>>> callable([1,3,5])
False
>>>
>>> callable(None)
False
6.? getattr():
getattr( ) 函數用于返回一個對象指定的屬性值。如果指定的屬性不存在,則返回default的值,若沒有設置default參數,則拋出AttributeError異常。以下為該函數的語法:
getattr(object, name[, default])
object -- 對象
name -- 字符串,對象屬性。
default -- 默認返回值,如果不提供該參數,在沒有對應屬性時,將觸發 AttributeError。
返回值:返回對象屬性值。
>>> class People:
... name = 'zth'
... age = 20
...
>>>
>>> a= People()
>>>
>>>
>>> getattr( a ,'name')
'zth'
>>>
>>> getattr( a ,'class',5)
5
>>>
>>> getattr( a ,'class')
Traceback (most recent call last):
File "", line 1, in AttributeError: 'People' object has no attribute 'class'
7 . setattr()
setattr( )函數對應函數getatt(),用于設置指定屬性的值,若指定的屬性不存在則新建屬性并賦值。以下為該函數的語法:
setattr(object, name, value)
object -- 對象。
name -- 字符串,對象屬性。
value -- 屬性值。
返回值:無
>>> class People:
... name = 'zth'
...
>>>
>>>
>>> a = People()
>>>
>>> setattr(a, 'name','en')
>>>
>>> setattr(a, 'age','20')
>>>
>>> getattr(a,'name')
'en'
>>>
>>> a.age
'20'
8.? delattr()
delattr( )函數用于刪除屬性,若屬性不存在則拋出 AttributeError 異常。以下為該函數的語法:
delattr(object, name)
object -- 類名。
name -- 必須是對象的屬性。
返回值:無
delattr(x, 'foobar') 相等于 del x.foobar。
>>> class People:
... name = 'zth'
... age = 20
...
>>>
>>> s = People()
>>>
>>> s.name
'zth'
>>>
>>>
>>> delattr(People, 'name')
>>>
>>> s.name
Traceback (most recent call last):
File "", line 1, in AttributeError: 'People' object has no attribute 'name'
>>>
>>> del People.age
>>>
>>> s.age
Traceback (most recent call last):
File "", line 1, in AttributeError: 'People' object has no attribute 'age'
總結
以上是生活随笔為你收集整理的python类的专有方法_Python——类的专有方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS内存区域部分内容
- 下一篇: websocket python爬虫_p