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