日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python类的专有方法_Python——类的专有方法

發布時間:2023/12/19 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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——类的专有方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。