反射

一:內置函數(一顆星)python

isinstance(obj,cls)檢查是否obj是不是類 cls 的對象函數

實例化一個對象,而後判斷對象是否是在類裏面spa

class Foo(object):
    pass

obj = Foo()

print(isinstance(obj, Foo))

issubclass(sub, super)檢查sub類是不是 super 類的派生類 orm

兩個類之間,判讀子類是否是父類派生類對象

class Foo(object):
    pass
class Bar(Foo):
    pass
print(issubclass(Bar, Foo))

二: python面向對象中的反射:經過字符串的形式操做對象相關的屬性。python中的一切事物都是對象(均可以使用反射)utf-8

四個能夠實現自省的函數(hasattr,getattr,delattr,setattr)字符串

下列方法適用於類和對象(一切皆對象,類自己也是一個對象)get

也就是這些內置函數源碼()源碼

def hasattr(*args, **kwargs):  # real signature unknown
    """
    Return whether the object has an attribute with the given name.

    This is done by calling getattr(obj, name) and catching AttributeError.
    """
    pass
class Foo:
    f='類的靜態屬性'
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def say(self):
        print('hi,%s'%self.name)
obj=Foo('egon',23)#obj是對象名
#檢查類是否含有默寫屬性 hasattr
# print(hasattr(obj,'name'))#對象名,屬性名
# print(hasattr(obj,'say'))#對象名,類中方法名
#
# #獲取類中屬性  getattr
# # 賦值
# n=getattr(obj,'age')  #對象名,屬性名
# print(n)
# # 直接打印
# print(getattr(obj,'age'))
# # 賦值一個函數名,
# func=getattr(obj,'say')
# func()#直接用函數名調用

# 設置屬性
# print(setattr(obj,'sb',True))
# print(setattr(obj,'show_name',lambda self:self.name+'sb'))
# print(obj.sb)
# print(obj.show_name(obj))#人打狗同樣對象.方法(對象)

# 刪除屬性
# print(delattr(obj,'age'))
# print(delattr(Foo,'say'))
# print(obj.__dict__)

# 一切皆對象
# class Foo():
#     staticField = "old boy"
#     def __init__(self):
#         self.name = 'wupeiqi'
#     def func():
#         return 'func'
#     @staticmethod   #裝飾一個不須要self參數函數,也不須要cls參數
#     def bar():   #括號裏沒有值
#         return 'bar'
#
#
# print(getattr(Foo, 'staticField'))
# print(getattr(Foo, 'func')())  #對象.方法(對象) 類也是一個對象
# print(getattr(Foo, 'bar')())

解讀:




改變對象的字符串顯示__str__,__repr__
自定製格式化字符串__format__


#_*_coding:utf-8_*_

format_dict={
    'nat':'{obj.name}-{obj.addr}-{obj.type}',#學校名-學校地址-學校類型
    'tna':'{obj.type}:{obj.name}:{obj.addr}',#學校類型:學校名:學校地址
    'tan':'{obj.type}/{obj.addr}/{obj.name}',#學校類型/學校地址/學校名
}
class School:
    def __init__(self,name,addr,type):
        self.name=name
        self.addr=addr
        self.type=type

    def __repr__(self):
        return 'School(%s,%s)' %(self.name,self.addr)   #類(格式化,self.name)(屬性名)
    def __str__(self):
        return '(%s,%s)' %(self.name,self.addr)#類(格式化,self.name (屬性名)

    def __format__(self, format_spec):
        # if format_spec
        if not format_spec or format_spec not in format_dict:
            format_spec='nat'
        fmt=format_dict[format_spec]
        return fmt.format(obj=self)

s1=School('oldboy1','北京','私立')
print('from repr: ',repr(s1))
print('from str: ',str(s1))
print(s1)

'''
str函數或者print函數--->obj.__str__()
repr或者交互式解釋器--->obj.__repr__()
若是__str__沒有被定義,那麼就會使用__repr__來代替輸出
注意:這倆方法的返回值必須是字符串,不然拋出異常
'''
print(format(s1,'nat'))
print(format(s1,'tna'))
print(format(s1,'tan'))
print(format(s1,'asfdasdffd'))

跟格式化format用法相似it

相關文章
相關標籤/搜索