python面向對象--類的特殊成員&&如何調用其他類的成員


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()
View Code

注意:類.方法(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()
View Code

注意:按照類的繼承順序,找下一個。而不是按照繼承關系找

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
View Code

注意: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()
View Code

 

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]
View Code 

 

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
View Code

注意:沒有返回值

 

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']
View Code

注意:無返回值

 

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)
View Code

注意: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 '''
View Code

 

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)
View Code

 

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 ,這個可以實驗一下
View Code

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}
View Code

 

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
View Code

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
View Code

 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__方法
View Code

 

 2.14 __eq__

 

 2.15 __hash__

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM