Python面向對象之魔法方法/雙下方法

1.__new__ and __init__ 
這兩個方法都是在實例化的時候執行,__new____init__ 以前執行,而且
若是實例化的時候封裝屬性,__new__也是必需要傳的,並且__new__必須有返回
值,並且這個返回值就是對象的內存空間並且會傳給__init__的self參數,並且
封裝的屬性也會傳給__init__.

class A:
    def __new__(cls, *args, **kwargs):
        print('我執行了')
        return super().__new__(cls)

    def __init__(self, name):
        self.name = name
        print('我也執行了')


a = A('Tom')

結果:
    我執行了
    我也執行了

單例模式:
class A:
    __INS = None

    def __new__(cls, *args, **kwargs):
        if not cls.__INS:
            cls.__INS = super().__new__(cls)
        return cls.__INS


a0 = A()
a1 = A()
a2 = A()
print(a0)
print(a1)
print(a2)

結果:
    <__main__.A object at 0x105e93518>
    <__main__.A object at 0x105e93518>
    <__main__.A object at 0x105e93518>

2. __hash__  當調用hash函數,字典的快速查詢 建立字典,集合的時候自動調用,爲何字典和集合的建立會調用?
那是由於字典和集合的建立是根據hash函數直接生成哈希值存儲的,查詢的時候是特別快的。必須有返回值,且爲整數。

class A:
    def __hash__(self):
        print('我執行了')
        return 1


a0 = A()
hash(a0)
dic = {a0: '1'}
s = {a0}

結果:
    我執行了
    我執行了
    我執行了

3.item系列  和 obj使用[]訪問值有關係 

__getitem__   obj[key] / obj[start:end] 自動執行
__setitem__      obj[key] = value 賦值的時候自動執行
__delitem__   del obj[key]  del 的時候執行 

class A:
    def __getitem__(self, item):
        return getattr(self, item)

    def __setitem__(self, key, value):
        return setattr(self, key, value)

    def __delitem__(self, key):
        return delattr(self, key)


a = A()

a['k'] = 'v'  # __setitem__
print(a['k'])  # __getitem__
print(a.__dict__)
del a['k']  # __delitem__
print(a.__dict__)

4.__call__  obj() 和 類()() 自動執行

class A:
    def __call__(self, *args, **kwargs):
        print('我執行了')


a = A()

A()()
a()

結果:
    我執行了
    我執行了

5.__len__ 該方法是對象在調用 len() 這個內置函數的時候自動觸發。必須有返回值,且爲整數類型

class A:
    def __len__(self):
        print('我執行了')
        return 1

a = A()
len(a)

結果:
    我執行了

6.  __eq__  當執行 == 這個魔法糖時自動執行 __eq__ 方法 ,必須有返回值,且爲bool

class A:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __eq__(self, other):
        return True if self.name == other.name and self.age == other.age else False



a0 = A('W', 18)
a1 = A('W', 18)
a2 = A('W', 18)
a3 = A('W', 18)

a4 = A('W', 18)

a5 = A('W', 18)
a6 = A('W', 18)
print(a0, a1)
print(a0 == a1)
print(a3 == a0 == a4)  # ==這個語法 是徹底和__eq__

結果:
    <__main__.A object at 0x109422438> <__main__.A object at 0x1094224e0>
    True
    True

7. __str__ and __repr__ 


# __str__ : str(obj),要求必須實現了__str__,要求這個方法的返回值必須是字符串str類型
        # print(obj) '%s'%s(obj) str(obj) 這三種狀況會自動觸發

# __repr__: 是__str__的備胎.若是有__str__方法,那麼
        # print %s str都先去執行__str__方法,而且使用__str__的返回值
        # 若是沒有__str__,那麼 print %s str都會執行repr
        # repr(obj),%r

# 在子類中使用__str__,先找子類的__str__,沒有的話要向上找,只要父類不是object,就執行父類的__str__
# 可是若是出了object以外的父類都沒有__str__方法,就執行子類的__repr__方法,若是子類也沒有,
# 還要向上繼續找父類中的__repr__方法.
# 一直找不到 再執行object類中的__str__方法


8. __del__ del obj 和 垃圾回收機制回收這個對象所佔內存的時候。
好比就是某對象借用了操做系統的資源,還要經過析構方法歸還回去這時會自動調用:文件資源,網絡資源
class A:
    def __del__(self):
        # 析構方法 del A的對象 會自動觸發這個方法
        print('執行我了')


a = A()
del a  # 對象的刪除 del

結果:
    我執行了
若是不用del obj 也會執行,由於程序運行完垃圾回收會回收a這時還會執行__del__方法。
相關文章
相關標籤/搜索