'''绑定方法类中定义函数分为了两大类: 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