python查看類方法
A. python獲取類方法的參數列表
用python的inspect模塊,inspect.getmembers得到所有的方法(注意第二個參數過濾函數)然後使用inspect.getargspec()得到函數的參數列表,參數類型,python是動態類型語言,這個重要嗎
B. python涓鍒ゆ柇鏁板肩被鍨
Python涓鍒ゆ柇鏁板肩被鍨
鍦≒ython涓錛屽垽鏂涓涓鍙橀噺鏄鍚︿負鏁板肩被鍨嬪彲浠ラ氳繃澶氱嶆柟娉曞疄鐜般傚父鐢ㄧ殑鏂規硶鍖呮嫭浣跨敤鍐呯疆鍑芥暟`isinstance`鍜宍type`銆備笅闈㈠皢璇︾粏浠嬬粛榪欎袱縐嶆柟娉曘
浣跨敤`isinstance`鍑芥暟鍒ゆ柇鏁板肩被鍨
`isinstance`鍑芥暟鏄疨ython鍐呯疆鐨勪竴涓鍑芥暟錛屽彲浠ョ敤鏉ユ鏌ヤ竴涓鍙橀噺鏄鍚﹀睘浜庣壒瀹氱殑綾誨瀷銆傚傛灉瑕佸垽鏂涓涓鍙橀噺鏄鍚︿負鏁板肩被鍨嬶紝鍙浠ヤ嬌鐢ㄥ備笅鏂瑰紡錛
紺轟緥浠g爜錛
python
num = 10
if isinstance): # 鍒ゆ柇鏄鍚︿負鏁存暟鎴栨誕鐐規暟綾誨瀷
else:
鍦ㄤ笂闈㈢殑浠g爜涓錛宍isinstance`鍑芥暟鐨勭涓涓鍙傛暟鏄瑕佹鏌ョ殑鍙橀噺錛岀浜屼釜鍙傛暟鏄涓涓鍏冪粍錛屽寘鍚浜嗚佹鏌ョ殑綾誨瀷銆傚湪榪欎釜渚嬪瓙涓錛屾垜浠媯鏌ヤ簡鍙橀噺`num`鏄鍚︿負鏁存暟鎴栨誕鐐規暟銆傚傛灉`num`鏄榪欎袱縐嶇被鍨嬩箣涓錛岄偅涔堟潯浠舵垚絝嬶紝杈撳嚭“鍙橀噺鏄鏁板肩被鍨”銆傚惁鍒欙紝杈撳嚭“鍙橀噺涓嶆槸鏁板肩被鍨”銆
浣跨敤`type`鍑芥暟鍒ゆ柇鏁板肩被鍨
鍙︿竴縐嶅垽鏂鏁板肩被鍨嬬殑鏂規硶鏄浣跨敤`type`鍑芥暟銆傝繖涓鍑芥暟浼氳繑鍥炰竴涓鍙橀噺鐨勭被鍨嬩俊鎮銆備絾鏄錛屼嬌鐢╜type`鍑芥暟鏉ュ垽鏂鏁板肩被鍨嬩笉澶熺洿瑙傦紝鍥犱負闇瑕佹瘮杈冭繑鍥炵殑綾誨瀷鍚嶇О瀛楃︿覆銆傜ず渚嬩唬鐮佸備笅錛
python
num = 10
if type.__name__ in ['int', 'float', 'complex']: # 鍒ゆ柇綾誨瀷鍚嶇О鏄鍚︿負鏁板肩被鍨
else:
python
鍦ㄨ繖孌典唬鐮佷腑錛屾垜浠棣栧厛浣跨敤`type`鑾峰彇鍙橀噺`num`鐨勭被鍨嬩俊鎮錛岀劧鍚庨氳繃璁塊棶榪欎釜綾誨瀷鐨刞__name__`灞炴ф潵鑾峰彇綾誨瀷鐨勫悕縐板瓧絎︿覆銆傛渶鍚庯紝鎴戜滑媯鏌ヨ繖涓鍚嶇О鏄鍚︿負'int'銆'float'鎴'complex'錛屼互紜瀹氬彉閲忔槸鍚︿負鏁板肩被鍨嬨傚傛灉婊¤凍鏉′歡錛屽垯杈撳嚭“鍙橀噺鏄鏁板肩被鍨”錛屽惁鍒欒緭鍑“鍙橀噺涓嶆槸鏁板肩被鍨”銆傞渶瑕佹敞鎰忕殑鏄錛岃繖縐嶆柟娉曞逛簬澶勭悊鏇村嶆潅鐨勬暟鎹緇撴瀯鍙鑳戒笉澶熺伒媧誨拰鍋ュ.銆傚洜姝ゅ湪瀹為檯搴旂敤涓錛岄氬父鏇村懼悜浜庝嬌鐢╜isinstance`鍑芥暟鏉ュ垽鏂鍙橀噺鐨勭被鍨嬨
C. python類的屬性有哪幾種如何訪問它們
屬性的訪問機制
一般情況下,屬性訪問的默認行為是從對象的字典中獲取,並當獲取不到時會沿著一定的查找鏈進行查找。例如a.x的查找鏈就是,從a.__dict__['x'],然後是type(a).__dict__['x'],再通過type(a)的基類開始查找。
若查找鏈都獲取不到屬性,則拋出AttributeError異常。
一、__getattr__方法
這個方法是當對象的屬性不存在是調用。如果通過正常的機制能找到對象屬性的話,不會調用__getattr__方法。
classA:
a=1
def__getattr__(self,item):
print('__getattr__call')
returnitem
t=A()
print(t.a)
print(t.b)
#output
1
__getattr__call
b
二、__getattribute__方法
這個方法會被無條件調用。不管屬性存不存在。如果類中還定義了__getattr__,則不會調用__getattr__()方法,除非在__getattribute__方法中顯示調用__getattr__()或者拋出了AttributeError。
classA:
a=1
def__getattribute__(self,item):
print('__getattribute__call')
raiseAttributeError
def__getattr__(self,item):
print('__getattr__call')
returnitem
t=A()
print(t.a)
print(t.b)
所以一般情況下,為了保留__getattr__的作用,__getattribute__()方法中一般返回父類的同名方法:
def__getattribute__(self,item):
returnobject.__getattribute__(self,item)
使用基類的方法來獲取屬性能避免在方法中出現無限遞歸的情況。
三、__get__方法
這個方法比較簡單說明,它與前面的關系不大。
如果一個類中定義了__get__(),__set__()或__delete__()中的任何方法。則這個類的對象稱為描述符。
classDescri(object):
def__get__(self,obj,type=None):
print("callget")
def__set__(self,obj,value):
print("callset")
classA(object):
x=Descri()
a=A()
a.__dict__['x']=1#不會調用__get__
a.x#調用__get__
如果查找的屬性是在描述符對象中,則這個描述符會覆蓋上文說的屬性訪問機制,體現在查找鏈的不同,而這個行文也會因為調用的不同而稍有不一樣:
- 如果調用是對象實例(題目中的調用方式),a.x則轉換為調用:。type(a).__dict__['x'].__get__(a, type(a))
- 如果調用的是類屬性,A.x則轉換為:A.__dict__['x'].__get__(None, A)
其他情況見文末參考資料的文檔
- 這個調用也屬於無條件調用,這點與__getattribute__一致。區別在於__getitem__讓類實例允許[]運算,可以這樣理解:
- __getattribute__適用於所有.運算符;
- __getitem__適用於所有[]運算符。
- classA(object):
- a=1
- def__getitem__(self,item):
- print('__getitem__call')
- returnitem
- t=A()
- print(t['a'])
- print(t['b'])
- def__getitem(self,item):
- returnobject.__getattribute__(self,item)
- classC(object):
- a='abc'
- def__getattribute__(self,*args,**kwargs):
- print("__getattribute__()iscalled")
- returnobject.__getattribute__(self,*args,**kwargs)
- #return"haha"
- def__getattr__(self,name):
- print("__getattr__()iscalled")
- returnname+"fromgetattr"
- def__get__(self,instance,owner):
- print("__get__()iscalled",instance,owner)
- returnself
- def__getitem__(self,item):
- print('__getitem__call')
- returnobject.__getattribute__(self,item)
- deffoo(self,x):
- print(x)
- classC2(object):
- d=C()
- if__name__=='__main__':
- c=C()
- c2=C2()
- print(c.a)
- print(c.zzzzzzzz)
- c2.d
- print(c2.d.a)
- print(c['a'])
- 可以結合輸出慢慢理解,這里還沒涉及繼承關系呢。總之,每個以__get為前綴的方法都是獲取對象內部數據的鉤子,名稱不一樣,用途也存在較大的差異,只有在實踐中理解它們,才能真正掌握它們的用法。
四、__getitem__方法
如果僅僅想要對象能夠通過[]獲取對象屬性可以簡單的:
總結
當這幾個方法同時出現可能就會擾亂你了。我在網上看到一份示例還不錯,稍微改了下:
D. python 獲取列表元素有幾種方式,常見的是哪種
Python中列表常見的方法有哪些?
Python列表定義:按特定順序排列的元素組成。在Python中,用方括弧[]來表示列表,並用逗號來分隔其中的元素。Python列表是編程中很常見的數據類型 。
列表是一種可修改的集合類型,其元素可以是數字、string等基本類型,也可以是列表、元組、字典等集合對象,甚至可以是自定義的類型。其定義方式如下:>>> nums = [1,2,3,4]>>> type(nums)>>> print nums[1, 2, 3, 4]>>> strs = ["hello","world"]>>> print strs['hello', 'world']>>> lst = [1,"hello",False,nums,strs]>>> type(lst)>>> print lst[1, 'hello', False, [1, 2, 3, 4], ['hello', 'world']]
下面我們來看一下列表中有哪些常見的方法:count():統計某個元素在列表中出現的次數。index():從列表中找出某個值第一個匹配項的索引位置。append():在列表末尾添加新對象。extend():在列表末尾一次性追加另一個序列的多個值。insert():在列表的指定位置插入對象。pop():移除列表中的一個元素(默認最後一個元素),並且返回該元素的值。remove():移除列表中某個值的第一個匹配項。reverse():將列表中的元素反向,不重新拷貝一個列表。reversed():將列表中的元素反向,重新拷貝一個列表。sort():將列表中的元素排序,不重新拷貝一個列表。sortd():將列表中的元素排序,重新拷貝一個列表。():淺拷貝,只是給原來的列表貼上了一個新標簽,對於一個復雜對象的子對象並不會完全復制,如果有子列表,改變原來的值,新的拷貝對象也會改變。deep():深拷貝,將復雜對象的每一層復制一個單獨的個體出來。就是完全拷貝。常見內置函數:max()、min()、sum()、len()、all()、any()、zip()、enumerate()由於文章篇幅有限,具體的代碼,推薦大家看這篇文章:https://www.jianshu.com/p/da6e449f4c6a
E. Python中的面向對象(進階)
一、實例方法,類方法,靜態方法
我們首先寫一個類,裡麵包含這三種方法。
可以看到,我們用到了兩個裝飾器。
我們用類和實例分別調用下類方法
我們用類和實例分別調用下靜態方法
靜態方法其實就是把一個普通的函數寫在類里,與直接在外層寫一個函數是一樣的,本質上是一個函數。
為了方便理解,我們分別列印下這些方法的類型
通過type()查看對象是方法還是函數
此外,還可以通過inspect模塊判斷某個對象是否是某種類型,返回布爾值。
用法
小Tips:概念理解
直接def定義的,我們叫做函數
把函數放到類里,我們叫做方法
方法可以通過裝飾器staticmethod轉為(放在方法里的)函數
繼承
一個類繼承另一個類時,會自動獲得另一個類的所有屬性和方法,被繼承的類稱之為父類,新類稱為子類。子類擁有父類所有的屬性和方法,並且可以定義自己的屬性和方法
我們以上邊的Rectangle類為父類來試一下
1)完全繼承
可以看到,子類完全繼承父類後,可以直接調用父類的所有方法。
2)部分繼承
部分繼承:繼承父類後,修改父類的同名方法
我們試一下,Square繼承Rectangle後,修改__init__()方法
3)拓展父類的方法
在保留父類中某個方法的代碼同時,對方法進行拓展
可以在方法中加入"super().方法名"來實現
4)@property