Python基礎(獲取對象信息)

import types
print(type('abc') == str)#True
print(type(123) == int)#True

def f1():
    pass
print(type(f1) == types.FunctionType)#True
print(type(abs) == types.BuiltinFunctionType)#True
print(type(lambda x:x) == types.LambdaType)#True
print(type(x for x in range(0,11)) == types.GeneratorType)#True

#isinstance()判斷的是一個對象是不是該類型自己,或者位於該類型的父繼承鏈上,老是優先使用isinstance()判斷類型,能夠將指定類型及其子類「一網打盡」
print(isinstance(b'b',bytes))#True
print(isinstance([1,2,3],(list,tuple)))#True    一個變量是不是某些類型中的一種

#得到一個對象的全部屬性和方法,可使用dir()函數,它返回一個包含字符串的list
print(dir('abc'))#['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

#配合getattr()、setattr()以及hasattr(),咱們能夠直接操做一個對象的狀態
class F1(object):
    def __init__(self,num):
        self.__num__ = num

    def get_num(self):
        return self.__num__
f1 = F1(300)
print(hasattr(f1,'__num__'))#True
setattr(f1,'x',200)#設置一個屬性'x'
print(getattr(f1,'x'))#200
print(getattr(f1,'get_num'))#<bound method F1.get_num of <__main__.F1 object at 0x000001C2A4B00358>>    能夠得到對象的方法
#print(F1.x)#x只是添加到了實例f1的屬性裏,沒有添加在F1的屬性裏

#定義了一個類屬性後,這個屬性雖然歸類全部,但類的全部實例均可以訪問到
class Student(object):
     name = 'Student'

s = Student() # 建立實例s
print(s.name) #Student 打印name屬性,由於實例並無name屬性,因此會繼續查找class的name屬性
print(Student.name) # Student打印類的name屬性
s.name = 'Michael' # 給實例綁定name屬性
print(s.name) #Michael 因爲實例屬性優先級比類屬性高,所以,它會屏蔽掉類的name屬性
print(Student.name) #Student 可是類屬性並未消失,用Student.name仍然能夠訪問
del s.name # 若是刪除實例的name屬性
print(s.name) #Student 再次調用s.name,因爲實例的name屬性沒有找到,類的name屬性就顯示出來了
#不要對實例屬性和類屬性使用相同的名字,由於相同名稱的實例屬性將屏蔽掉類屬性,可是當你刪除實例屬性後,再使用相同的名稱,訪問到的將是類屬性
相關文章
相關標籤/搜索