1. 程式人生 > >面向物件 類中部分特殊成員

面向物件 類中部分特殊成員

沒啥可說的直接上程式碼看:


class Foo(object):

    def __init__(self,a1,a2):
        self.a1 = a1
        self.a2 = a2

    def __call__(self, *args, **kwargs):
        print(11111,args,kwargs)
        return 123

    def __getitem__(self, item):
        print(item)
        return 8

    def __setitem__(self, key, value):
        print(key,value,111111111)

    def __delitem__(self, key):
        print(key)

    def __add__(self, other):
        return self.a1 + other.a2

    def __enter__(self):
        print('1111')
        return 999

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('22222')

# 1. 類名() 自動執行 __init__
obj = Foo(1,2)

# 2. 物件() 自動執行 __call__
ret = obj(6,4,2,k1=456)

# 3. 物件['xx']  自動執行 __getitem__
ret = obj['yu']
print(ret)

# 4. 物件['xx'] = 11  自動執行 __setitem__
obj['k1'] = 123

# 5. del 物件[xx]     自動執行 __delitem__
del obj['uuu']

# 6. 物件+物件         自動執行 __add__
obj1 = Foo(1,2)
obj2 = Foo(88,99)
ret = obj2 + obj1
print(ret)

# 7. with 物件        自動執行 __enter__ / __exit__
obj = Foo(1,2)
with obj as f:
    print(f)
    print('內部程式碼')

# 8. 真正的構造方法
class Foo(object):
    def __init__(self, a1, a2):     # 初始化方法
        """
        為空物件進行資料初始化
        :param a1:
        :param a2:
        """
        self.a1 = a1
        self.a2 = a2

    def __new__(cls, *args, **kwargs): # 構造方法
        """
        建立一個空物件
        :param args:
        :param kwargs:
        :return:
        """
        return object.__new__(cls) # Python內部建立一個當前類的物件(初創時內部是空的.).

obj1 = Foo(1,2)
print(obj1)

obj2 = Foo(11,12)
print(obj2)