【python】類的特殊成員

Tony_xiao發表於2024-08-21
  • 上文介紹了Python的類成員以及成員修飾符,從而瞭解到類中有欄位、方法和屬性三大類成員,並且成員名前如果有兩個下劃線,則表示該成員是私有成員,私有成員只能由類內部呼叫。無論人或事物往往都有不按套路出牌的情況,Python的類成員也是如此,存在著一些具有特殊含義的成員,詳情如下:
__init__    類()自動執行
__del__
__call__    物件(),類()() 自動執行
__int__     int(obj)
__str__     str(obj)

__add__
__dict__   #將物件中封裝的所有內容透過字典的形式返回

__getitem__   切片或者索引
__setitem__
__delitem__

__iter__
    如果類中有__iter__方法,物件===》》可迭代物件
    物件.__iter__() 的返回值:迭代器
    for迴圈,迭代器,next方法
    for迴圈,可迭代物件,物件.__iter__() ,迭代器,next方法
    1、執行Li物件的類Foo類中的__iter__方法,並獲取其返回值
    2、迴圈上一步中返回的物件
  • 1.call,物件後面加括號,觸發執行。
class Foo:
    def __init__(self):
        print('init')
    def __call__(self, *args, **kwargs):
        print('call')
obj = Foo()
obj()   #物件()自動執行__call__方法

-2.str,如果一個類中定義了__str__方法,那麼在列印 物件 時,預設輸出該方法的返回值。

class Foo:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return '%s-%s'%(self.name,self.age)
obj = Foo('xwl',23)
print(obj)    #print(str(obj))--->>str(obj)--->>obj中的__str__,並獲取返回值
  • 3.dict,類或物件中的所有成員
class Foo:
    """
        描述
    """
    def __init__(self,name,age):
        self.name = name
        self.age = age
obj = Foo('xwl',18)
b = obj.__dict__   # {'name': 'xwl', 'age': 18}
print(b)
ret = Foo.__dict__
print(ret)
#{'__module__': '__main__', '__doc__': '\n        描述\n    ', 
# '__init__': <function Foo.__init__ at 0x000002AA9219C820>, '__dict__': <attribute '__dict__' of 'Foo' objects>, 
# '__weakref__': <attribute '__weakref__' of 'Foo' objects>}

-4.getitemsetitemdelitem,用於索引操作,如字典。以上分別表示獲取、設定、刪除資料

class Foo:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __getitem__(self, item):
        return item+10
    def __setitem__(self, key, value):
        print(key,value)
    def __delitem__(self, key):
        print(key)
Li = Foo('xwl',18)
r = Li[1]   #自動執行Li物件中的__getitem__方法
print(r)    # 11
Li[100] = 'dasdfd'   #自動執行Li物件中的__setitem__方法    # 100 dasdfd
del Li[999]             #自動執行Li物件中的__delitem__方法   # 999
  • 5.iter ,用於迭代器,之所以列表、字典、元組可以進行for迴圈,是因為型別內部定義了 iter
class Foo:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __iter__(self):
        return iter([11,22,33,44])
Li = Foo('xwl',18)
#如果類中有__iter__方法,物件===》》可迭代物件
#物件.__iter__() 的返回值:迭代器
#for迴圈,迭代器,next方法
#for迴圈,可迭代物件,物件.__iter__() ,迭代器,next方法
#1、執行Li物件的類Foo類中的__iter__方法,並獲取其返回值
#2、迴圈上一步中返回的物件
for i in Li:
    print(i)

相關文章