'''綁定方法類中定義函數分爲了兩大類: 1. 綁定方法 特殊之處: 綁定給誰就應該由誰來調用,誰來調用就會將誰當作第一個參數自動傳入 如何用: 綁定給對象的方法: 在類中定義函數沒有被任何裝飾器修飾的狀況下,默認就是綁定對象的 綁定給類的方法: 爲類中定義函數添加一個裝飾器classmethod,就是綁定類的 2. 非綁定方法 特殊之處: 非綁定方法就是一個普通函數,既不與類綁定又不與對象綁定, 意味着類與對象均可以調用,可是不管誰來調用都是一個普通函數,沒有自動傳值效果 如何用: 非綁定方法: 爲類中定義函數添加一個裝飾器staticmethod,就是非綁定方法 三種方法使用:關鍵是看函數體的代碼具體使用狀況 import uuid print(uuid.uuid4()) #一.綁定給對象的方法 # 綁定給對象的,應該由對象來調, # obj.func1() # print(obj) # 綁定給對象的方法,類也能夠調用,可是類調用就是一個普通函數,沒有自動傳值的效果 # print(obj.func1) # print(Foo.func1) # Foo.func1(obj) #二.綁定給類的方法 # 綁定給類的,應該由類來調,(如用對象來調用,自動傳的仍是類) # print(Foo.func2) # print(obj.func2) # Foo.func2() # obj.func2() #三.非綁定方法 # print(obj.func3) # print(Foo.func3) # obj.func3(1,2) # Foo.func3(1,3)''''''# class Foo:# def func1(self):# print('func1',self)## @classmethod# def func2(cls):# print('func2',cls)## @staticmethod# def func3(x,y):# print('func3',x,y)## obj=Foo()# ==========================# import settings## class MySQL:# def __init__(self,ip,port):# self.id=self.create_id()# self.ip=ip# self.port=port## def tell_info(self):# print('<%s:%s:%s>' % (self.id,self.ip, self.port))## @classmethod# def from_conf(cls):# return cls(settings.IP, settings.PORT)## @staticmethod# def create_id():# import uuid# return uuid.uuid4()# obj=MySQL('1.1.1.1',3306)# obj1=MySQL('1.1.1.2',3406)# obj.tell_info()# obj1.tell_info()# obj2=MySQL.from_conf()# obj2.tell_info()''''''反射 經過字符串的形式操做對象相關的屬性。 python中的一切事物都是對象(均可以使用反射)總之反射的好處就是, 能夠事先定義好接口,接口只有在被完成後纔會真正執行,這實現了即插即用, 這實際上是一種‘後期綁定’,什麼意思? 即你能夠事先把主要的邏輯寫好(只定義接口),而後後期再去實現接口的功能四個能夠實現自省的函數下列方法適用於類和對象(一切皆對象,類自己也是一個對象) #hasattr 判斷屬性或功能是否存在 # print(hasattr(obj,'name')) #obj.name # print(hasattr(obj,'tell_info')) #obj.tell_info #getattr 查詢屬性,None的位置是填默認值 # res=getattr(obj,'name') #res=obj.name # res=getattr(obj,'xxx',None) #setattr 更改,新增 # setattr(obj,'age',38) # setattr(obj,'sex','male') #delattr 刪除 # delattr(obj,'name')''''''# class Foo:# def __init__(self,name,age):# self.name=name# self.age=age## def tell_info(self):# print('%s:%s' %(self.name,self.age))## obj=Foo('egon練習',18)#hasattr# print(hasattr(obj,'name')) #obj.name# print(hasattr(obj,'tell_info')) #obj.tell_info#getattr# res=getattr(obj,'name') #res=obj.name# print(res)# res=getattr(obj,'xxx',None)# print(res)#setattr# setattr(obj,'age',38)# setattr(obj,'sex','male')# print(obj.__dict__)# print(obj.sex)#delattr# delattr(obj,'name')# if hasattr(obj,'xxxxe'):# delattr(obj,'xxxxe')# print(obj.__dict__)'''# isinstance(obj,cls)檢查是否obj是不是類 cls 的對象# issubclass(sub, super)判斷是不是子類(檢查sub類是不是 super 類的派生類)'''# isinstance(obj,cls)檢查是否obj是不是類 cls 的對象# print(isinstance([],list)) #type([]) is list# class Foo:# pass# obj=Foo()# print(isinstance(obj,Foo))# issubclass(sub, super)判斷是不是子類(檢查sub類是不是 super 類的派生類)# class Foo:# pass## class Bar(Foo):# pass# print(issubclass(Bar,Foo))'''# __str__: 會在對象被打印時自動觸發,而後將返回值返回給print功能進行打印# l=list([1,2,3])# print(l) #(同理,定製對象的顯示效果,經常使用!!!)# __del__: 會在對象被刪除時自動觸發執行,用來在對象被刪除前回收系統資源# 經常使用語回收 文件的關閉'''# __str__: 會在對象被打印時自動觸發,而後將返回值返回給print功能進行打印# class People:# def __init__(self,name,age):# self.name=name# self.age=age## def __str__(self):# return '<%s:%s>' %(self.name,self.age)## peo=People('egon練習',18)# print(peo) #print(peo.__str__())## l=list([1,2,3])# print(l)# __del__: 會在對象被刪除時自動觸發執行,用來在對象被刪除前回收系統資源# class Foo:# def __del__(self):# print('===>')## obj=Foo()# # del obj# print('其餘代碼...')# class Bar:# def __init__(self,x,y,filepath):# self.x=x# self.y=y# self.f=open(filepath,'r',encoding='utf-8')# def __del__(self):# # 寫回收系統資源相關的代碼# self.f.close()## obj=Bar(10,20)# del obj'''# =================================(後期)# 四 二次加工標準類型(包裝)# 六 描述符(__get__,__set__,__delete__)# 熟透對象後再看這兩塊知識:# http://www.cnblogs.com/linhaifeng/articles/6204014.html