1 主動調用其他類的成員
若子類和父類有相同的方法,那么該如何都調用呢?
1.1 方式一 :類.方法(self)
![]() 1 class Base(object): 2 3 def f1(self): 4 print('5個功能') 5 6 class Foo(object): 7 8 def f1(self): 9 print('3個功能') 10 Base.f1(self) 11 12 obj = Foo() 13 obj.f1() 注意:類.方法(self)----需要自己寫參數 |
1.2 方式二:按照類的繼承順序,找下一個
![]() 1 class Foo(object): 2 3 def f1(self): 4 5 super().f1() 6 7 print('3個功能') 8 9 10 class Bar(object): 11 12 def f1(self): 13 14 print('6個功能') 15 16 17 18 class Info(Foo,Bar): 19 20 pass 21 22 23 24 obj = Info() 25 26 obj.f1() 注意:按照類的繼承順序,找下一個。而不是按照繼承關系找 super().f1()和self.f1()方式不同,self每次得回Info去尋找,而super直接按照Info--->Foo--->Bar順序執行 |
2 類的特殊成員
這些特殊成員並沒有特殊的功能,僅僅是某些外部的操作觸發了特定的特殊成員
2.1 __init__() && __new__() 構造方法
類名() -------》自動執行__new__/ __init__
![]() 1 class Foo: 2 3 def __init__(self,a1,a2): #初始化方法 4 #為空對象進行數據初始化 5 self.a1 = a1 6 self.a2 = a2 7 print(2) 8 9 def __new__(cls, *args, **kwargs): #構造方法 10 #創建一個空對象 11 print(1,args,kwargs) 12 return object.__new__(cls) #python內部創建一個當前類的對象(初創時內部是空的) 13 14 obj = Foo(3,4) 15 #1 (3, 4) {} 16 #2 注意:1:__new__()必須要有返回值,返回一個對象,因此傳給__init__的self就是一個對象 2:先執行__new__()后執行__init__() 3:所有的對象的創建都是由object創建的 4:注意:並不是__new__()就是構造函數的意思,是因為obj = Foo(3,4)觸發了__new__()的自動執行 |
2.2 __call__()
對象() -------》自動執行__call__
![]() 1 class Foo: 2 def __init__(self,a1,a2): #初始化方法 3 #為空對象進行數據初始化 4 self.a1 = a1 5 self.a2 = a2 6 print(2) 7 8 def __call__(self, *args, **kwargs): 9 print(111,args,kwargs) 10 11 obj = Foo(3,4) 12 ret = obj() |
2.3 __getitem__()
對象['xx'] ------》 自動執行 __getitem__
![]() 1 class Foo: 2 3 def __init__(self,a1,a2): #初始化方法 4 #為空對象進行數據初始化 5 self.a1 = a1 6 self.a2 = a2 7 print(2) 8 9 def __getitem__(self, item): 10 print(item) 11 12 obj = Foo(3,4) 13 ret = obj[5] |
2.4 __setitem__()
對象['xx'] = xxx 自動執行 __setitem__
![]() 1 class Foo: 2 3 def __init__(self,a1,a2): #初始化方法 4 #為空對象進行數據初始化 5 self.a1 = a1 6 self.a2 = a2 7 print(2) 8 def __setitem__(self, key, value): 9 print(key,value) 10 return 1 11 12 obj = Foo(1,2) 13 obj['k1'] = 123 14 15 # k1 123 注意:沒有返回值 |
2.5 __delitem__()
del 對象[xx] 自動執行 __delitem__
![]() 1 class Foo: 2 def __init__(self,a1,a2): #初始化方法 3 #為空對象進行數據初始化 4 self.a1 = a1 5 self.a2 = a2 6 print(2) 7 8 def __delitem__(self, key): 9 print(key) 10 return 1 11 12 obj = Foo(1,2) 13 del obj['uuu'] 注意:無返回值 |
2.6 __add__()
對象+對象 自動執行 __add__
![]() 1 class Foo(object): 2 3 def __init__(self, a1, a2): 4 self.a1 = a1 5 self.a2 = a2 6 7 def __add__(self, other): 8 return self.a1 + other.a2 9 10 obj1 = Foo(1,2) 11 obj2 = Foo(3,4) 12 ret = obj1 + obj2 13 print(ret) 注意:obj1,obj2 與 self, other兩兩對應 |
2.7 __enter__() && __exit__()
with 對象 自動執行 __enter__ / __exit__
![]() 1 class Foo(object): 2 def __init__(self, a1, a2): 3 self.a1 = a1 4 self.a2 = a2 5 6 def __enter__(self): 7 print('1111') 8 return 999 9 10 def __exit__(self, exc_type, exc_val, exc_tb): 11 print('22222') 12 13 obj = Foo(1,2) 14 with obj as f: 15 print(f) 16 print('內部代碼') 17 18 19 20 答案: 21 22 ''' 23 1111 24 999 25 內部代碼 26 22222 27 ''' |
2.8 __str__()
作用:
把打印的對象變成字符串
用法舉例:
![]() 1 class Foo(object): 2 def __init__(self): 3 pass 4 def func(self): 5 pass 6 def __str__(self): 7 return 'F1' 8 9 obj = Foo() 10 print(obj) |
2.9 __iter__()
作用:
如果想要把不可迭代對象 -> 可迭代對象 1. 在類中定義__iter__方法 2. iter內部返回一個迭代器(生成器也是一種特殊迭代器) |
用法舉例:
![]() 1 class Foo(object): 2 def __init__(self,name,age): 3 self.name = name 4 self.age = age 5 6 def func(self): 7 pass 8 def __iter__(self): 9 # return iter([1,2]) #用法一 10 yield 1 #用法二 11 yield 2 12 13 obj1 = Foo('劉we',99) 14 for item in obj1: 15 print(item) 16 17 注意:iter()相當於for xx in ,這個可以實驗一下 return iter()------->就是把可迭代對象轉化成迭代器返回 |
2.10 __dcit__
作用:
把對象封裝的所有值以字典拿到
用法舉例:
![]() 1 class Foo(object): 2 def __init__(self,name,age): 3 self.name = name 4 self.age = age 5 self.s = None 6 7 def func(self): 8 pass 9 10 obj1 = Foo('liu',99) 11 obj2 = Foo('op',89) 12 13 print(obj1.__dict__) 14 print(obj2.__dict__) 15 # {'name': 'liu', 'age': 99, 's': None} 16 # {'name': 'op', 'age': 89, 's': None} |
2.11 __doc__
作用:獲取注釋信息
用法舉例:
![]() 1 class Foo: 2 ''' 3 asfffgfg 4 ''' 5 def __init__(self,name): 6 self.name = name 7 def func(self): 8 pass 9 10 obj = Foo(1) 11 print(obj.__doc__) #asfffgfg |
2.12 __getattr__()
作用:對象.x

1 class Local(object): 2 def __getattr__(self, item): 3 return 333 4 5 obj = Local() 6 print(obj.x) #333
2.13 __setattr__()
作用:對象.x = 值

1 class Foo(): 2 def __init__(self): 3 self.name = 'alex' #默認自己類中執行__setattr__ 4 5 # def __setattr__(self, key, value): 6 # pass 7 # object.__setattr__(self, key, value) 8 9 10 obj = Foo() 11 print(obj.name) 12 #對象.x默認先執行自己類里面的__setattr__方法,自己類里面沒有,則去父類里面找。 13 # 對象在實例化過程中默認先執行__new__方法,然后在執行__init__方法
2.14 __eq__
2.15 __hash__