python查看對象方法
1. python如何判斷類型
python中是可以判斷對象的類型的,判斷python中的對象類型,可以使用isinstance()函數。
isinstance是Python中的一個內建函數。是用來判斷一個對象的變數類型。函數語法格式為
isinstance(object, class-or-type-or-tuple)
如果參數object是classinfo的實例,或者object是classinfo類的子類的一個實例, 返回True。如果object不是一個給定類型的的對象, 則返回結果總是False。
例如
>>> isinstance(1, int)
True
>>> isinstance(1.0, float)
True
2. 如何查看 Python 全部內置變數和內置函數
查看python內置函數的方法:1、打開Python IDLE編輯器;2、輸入" dir(__builtins__)"命令,按下回車鍵(Enter)得到Python全部內置變數和函數。
如何查看 Python 全部內置變數和內置函數?
1 如圖,打開 Python IDLE,我用的 是 Python 3.7 ,界面有個性定製。你的版本不同,界面有差異,但是操作方法應該是一樣的。
2 輸入 dir(__builtins__)
按下回車鍵(Enter)。
3 也可以:
import builtins
dir(builtins)
按下回車鍵(Enter)。
得到的結果和 dir(__builtins__) 是一樣的。
4 那麼這返回的一大堆到底是什麼東西?
可以看到,返回的結果是以 [ 開頭以 ] 結尾,說明是個列表,我們看看這列表裡一共有多少個元素?
輸入:
len(dir(__builtins__))
得到一個數字,154 ,說明當前版本的 Python 內置的常量和函數總數是 154 。
5 我們再重新輸出一下這個列表,逐個列印出來,更好看一點。
for item in dir(__builtins__):
print(item)
按下兩次回車鍵(Enter)。按照默認的字母順序,先是大寫字母 A-Z,然後是下劃線(_)開頭的,然後是小寫字母 a-z ,為什麼是這個順序?因為按照 ASCII 碼表,表示小寫字母的數字比表示大寫字母的數字要大,而表示下劃線(_)的數字居中,所以如此。
6 print() 就是 Python 3 的默認函數。我們試試:
print('Hello World')
builtins.print('Hello World')
__builtins__.print('Hello World')
運行結果如下,可以看到,結果是一樣的。
dir()本身就是 Python 的內置函數,利用它,我們可以查看對象的全部方法和屬性,對於掌控全局,了解全貌很有用。
課程推薦:Python快速教程之從入門到精通
3. Python中類與對象的其他說明
9.4. 一些說明
數據屬性會覆蓋同名的方法屬性。為了避免意外的名稱沖突,這在大型程序中是極難發現的 Bug,使用一些約定來減少沖突的機會是明智的。可能的約定包括:大寫方法名稱的首字母,使用一個唯一的小字元串(也許只是一個下劃線)作為數據屬性名稱的前綴,或者方法使用動詞而數據屬性使用名詞。
數據屬性可以被方法引用,也可以由一個對象的普通用戶(客戶)使用。換句話說,類不能用來實現純凈的數據類型。事實上,Python 中不可能強制隱藏數據——一切基於約定(如果需要,使用 C 編寫的 Python 實現可以完全隱藏實現細節並控制對象的訪問。這可以用來通過 C 語言擴展 Python)。
客戶應該謹慎的使用數據屬性——客戶可能通過踐踏他們的數據屬性而使那些由方法維護的常量變得混亂。注意:只要能避免沖突,客戶可以向一個實例對象添加他們自己的數據屬性,而不會影響方法的正確性——再次強調,命名約定可以避免很多麻煩。
從方法內部引用數據屬性(或其他方法)並沒有快捷方式。我覺得這實際上增加了方法的可讀性:當瀏覽一個方法時,在局部變數和實例變數之間不會出現令人費解的情況。
一般,方法的第一個參數被命名為 self。這僅僅是一個約定:對 Python 而言,名稱 self 絕對沒有任何特殊含義。(但是請注意:如果不遵循這個約定,對其他的 Python 程序員而言你的代碼可讀性就會變差,而且有些 類查看器 程序也可能是遵循此約定編寫的。)
類屬性的任何函數對象都為那個類的實例定義了一個方法。函數定義代碼不一定非得定義在類中:也可以將一個函數對象賦值給類中的一個局部變數。例如:
# Function defined outside the class
def f1(self, x, y):
return min(x, x+y)
class C:
f = f1
def g(self):
return 'hello world'
h = g
現在 f, g 和 h 都是類 C 的屬性,引用的都是函數對象,因此它們都是 C 實例的方法-- h 嚴格等於 g 。要注意的是這種習慣通常只會迷惑程序的讀者。
通過 self 參數的方法屬性,方法可以調用其它的方法:
class Bag:
def __init__(self):
self.data = []
def add(self, x):
self.data.append(x)
def addtwice(self, x):
self.add(x)
self.add(x)
方法可以像引用普通的函數那樣引用全局命名。與方法關聯的全局作用域是包含類定義的模塊。(類本身永遠不會作為全局作用域使用。)盡管很少有好的理由在方法 中使用全局數據,全局作用域卻有很多合法的用途:其一是方法可以調用導入全局作用域的函數和方法,也可以調用定義在其中的類和函數。通常,包含此方法的類也會定義在這個全局作用域,在下一節我們會了解為何一個方法要引用自己的類。
每個值都是一個對象,因此每個值都有一個 類( class ) (也稱為它的 類型( type ) ),它存儲為 object.__class__ 。
4. 怎麼判斷 Python 對象是否包含某個屬性
頂級函數hasattr可以查看對象是否包含某某屬性,這里的屬性包括數據屬性和方法。getattr可以獲取屬性。
如下舉例說明。
a=[1,2,3]
print('列表有count屬性:%s'%hasattr(a,'count'))
print('列表有append屬性:%s'%hasattr(a,'append'))
print('列表有shift屬性:%s'%hasattr(a,'shift'))
print('列表的count屬性是方法:%s'%hasattr(getattr(a,'count'),'__call__'))
print('列表的append屬性是方法:%s'%hasattr(getattr(a,'append'),'__call__'))
classmyclass():
def__init__(self):
self.valattr=3
defmethod(self):
pass
mc=myclass()
print('myclass有valattr屬性:%s'%hasattr(mc,'valattr'))
print('myclass有method屬性:%s'%hasattr(mc,'method'))
print('myclass的valattr屬性是方法:%s'%hasattr(getattr(mc,'valattr'),'__call__'))
print('myclass的method屬性是方法:%s'%hasattr(getattr(mc,'method'),'__call__'))
5. python怎麼查看object 里的成員變數
首先通過一個例子來看一下本文中可能用到的對象和相關概念。
對於實現了__call__的類實例,這個方法會返回False。如果目的是只要可以直接調用就需要是True的話,不妨使用isinstance(obj, collections.Callable)這種形式。我也不知道為什麼Callable會在collections模塊中,抱歉!我猜大概是因為collections模塊中包含了很多其他的ABC(Abstract Base Class)的緣故吧:)
3.2. 獲取對象信息
getmembers(object[, predicate]):這個方法是dir()的擴展版,它會將dir()找到的名字對應的屬性一並返回,形如[(name, value), ...]。另外,predicate是一個方法的引用,如果指定,則應當接受value作為參數並返回一個布爾值,如果為False,相應的屬性將不會返回。使用is*作為第二個參數可以過濾出指定類型的屬性。
getmole(object):還在為第2節中的__mole__屬性只返回字元串而遺憾嗎?這個方法一定可以滿足你,它返回object的定義所在的模塊對象。
get{file|sourcefile}(object):獲取object的定義所在的模塊的文件名|源代碼文件名(如果沒有則返回None)。用於內建的對象(內建模塊、類、函數、方法)上時會拋出TypeError異常。
get{source|sourcelines}(object):獲取object的定義的源代碼,以字元串|字元串列表返回。代碼無法訪問時會拋出IOError異常。只能用於
6. 怎麼判斷 Python 對象是否包含某個屬性
頂級函數hasattr可以查看對象是否包含某某屬性,這里的屬性包括數據屬性和方法。getattr可以獲取屬性。
如下舉例說明。
a=[1,2,3]
print('列表有count屬性:%s'%hasattr(a,'count'))
print('列表有append屬性:%s'%hasattr(a,'append'))
print('列表有shift屬性:%s'%hasattr(a,'shift'))
print('列表的count屬性是方法:%s'%hasattr(getattr(a,'count'),'__call__'))
print('列表的append屬性是方法:%s'%hasattr(getattr(a,'append'),'__call__'))
class myclass():
def __init__(self):
self.valattr=3
def method(self):
pass
mc=myclass()
print('myclass有valattr屬性:%s'%hasattr(mc,'valattr'))
print('myclass有method屬性:%s'%hasattr(mc,'method'))
print('myclass的valattr屬性是方法:%s'%hasattr(getattr(mc,'valattr'),'__call__'))
print('myclass的method屬性是方法:%s'%hasattr(getattr(mc,'method'),'__call__'))