一、绑定方法与非绑定方法
类中定义函数分为了两大类:
1. 绑定方法
特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入
绑定给对象的方法: 在类中定义函数没有被任何装饰器修饰的情况下,默认就是绑定对象的
绑定给类的方法: 为类中定义函数添加一个装饰器classmethod,就是绑定类的
2. 非绑定方法
特殊之处: 非绑定方法就是一个普通函数,既不与类绑定又不与对象绑定,意味着类与对象都可以调用,但是无论谁来调用都是一个普通函数,没有自动传值效果
非绑定方法: 为类中定义函数添加一个装饰器staticmethod,就是非绑定方法
#绑定方法: # 1、对象绑定类,调用函数时候自动传值,类可以调用函数,但要自己传值给参数, # 函数需要的参数一个不能少 # obj=Fool() # obj.func1() #func1 <__main__.Fool object at 0x0000000001F87470> # Fool.func1(Fool) #func1 <class '__main__.Fool'> #2、类绑定类,在函数上面添加装饰器classmethod,类调用函数时候会自动传值, #对象也能调用被绑定类的函数,自动传值,原理是用对象的那个类调用被绑定类的函数 # Fool.func2() #func2 <class '__main__.Fool'> # obj=Fool() # obj.func2() #func2 <class '__main__.Fool'> #非绑定方法 staticmethod #3、在类中的函数上面添加装饰器staticmethod,那个函数与对象、类都不绑定,也就是说不能自动传值 #调用时候要当普通函数使用,有多少参数就传多少参数 # obj=Fool() # obj.fun3('egon') #fun3 egon # Fool.fun3('hu') #fun3 hu
3、为什么要用类绑定,和非绑定方法
创造一个类,可以读取配置文件的IP和port,可以从从配置文件实现实例化(创造一个对象),给每个对象一个ID
import setting class MySQL: def __init__(self,ip,port): self.ip=ip self.port=port self.id=self.UID() def tell(self): print('ip:%s port:%s id:%s' %(self.ip,self.port,self.id)) @classmethod #从配置文件实现实例化(创造一个对象) def From_con(cls): return cls(setting.IP,setting.PORT) #给每个对象一个ID 独立完成功能 可以用uuid模块 @staticmethod def UID(): import uuid return uuid.uuid4()
二,反射
1、什么是反射
反射指的是通过字符串来操作属性
2、怎么用
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__)
三、常用内置方法
PS:内置函数
isinstance()判断一个对象是不是另一个类的实例(对象)
issubclass()判断一个类是不是另一个类的子类
1、__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]) list的本质是个类,也有__str__,所以实例化过程中没有显示出内存地址 # print(l)
2、__del__
会在对象呗删除时自动触发执行,用来在对象被删除前回收系统资源
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