绑定与非绑定,反射,内置方法
目录:
绑定与非绑定方法:
类中定义函数分为了两大类: 1. 绑定方法 特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 绑定给对象的方法: 在类中定义函数没有被任何装饰器修饰的情况下,默认就是绑定对象的 绑定给类的方法: 为类中定义函数添加一个装饰器classmethod,就是绑定类的 2. 非绑定方法 特殊之处: 非绑定方法就是一个普通函数,既不与类绑定又不与对象绑定,意味着类与对象都可以调用,但是无论谁来调用都是一个普通函数,没有自动传值效果 非绑定方法: 为类中定义函数添加一个装饰器staticmethod,就是非绑定方法
示例代码:
class Foo: # 绑定对象 def func1(self): print('func1',self) # 绑定类 @classmethod def func2(cls): print('func2',cls) # 非绑定方法,必须明确加staticmethod @staticmethod def func3(x,y): print('func3',x,y) obj=Foo()
一:绑定给对象的方法
#绑定给对象的,应该由对象来调, 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)
两种方法,三种情况:具体使用绑定方法还是非绑定方法要根据函数代码确定
settings.py IP='10.10.0.11' PORT=3307
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) #生成ID,不需要传值,非绑定方法 @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()
反射:通过字符串来操作属性
定义类:
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)
四个方法:
1 #hasattr,判断是否有该属性 2 print(hasattr(obj,'name')) #obj.name 3 print(hasattr(obj,'tell_info')) #obj.tell_info 4 5 #getattr,获得属性 6 res=getattr(obj,'name') #res=obj.name 7 print(res) 8 res=getattr(obj,'age',None)#第三个参数 用来防止报错 9 print(res) 10 11 #setattr,改或者增加属性 12 setattr(obj,'age',38) 13 setattr(obj,'sex','male') 14 print(obj.__dict__) 15 print(obj.sex) 16 17 #delattr,删除属性 18 delattr(obj,'name') 19 delattr(obj,'age') 20 if hasattr(obj,'xxxxe'): 21 delattr(obj,'xxxxe') 22 print(obj.__dict__)
内置方法:
判断是否为对象或子类:
# isinstance()判断是否是某个类的实例 print(isinstance([],list)) #type([]) is list True class Foo: pass
obj=Foo() print(isinstance(obj,Foo))#True # issubclass()判断是否是某个类的子类 class Foo: pass class Bar(Foo): pass
print(issubclass(Bar,Foo)
__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)#调用了内部的__str__方法
__del__: 会在对象被删除时自动触发执行,用来在对象被删除前回收系统资源
1 class Foo: 2 def __del__(self): 3 print('===>') 4 obj=Foo() 5 del obj 6 print('其他代码...') 7 # ===> 8 # 其他代码... 9 10 ----------------------- 11 class Foo: 12 def __del__(self): 13 print('===>') 14 obj=Foo() 15 print('其他代码...') 16 # 其他代码... 17 # ===> 18 # 程序结束的时候会自动调用__del__方法, 19 20 ----------------------------------------- 21 class Bar: 22 def __init__(self,x,y,filepath): 23 self.x=x 24 self.y=y 25 # 打开一个文件,没有关闭 26 self.f=open(filepath,'r',encoding='utf-8') 27 def __del__(self): 28 # 写回收系统资源相关的代码,在程序结束时自动执行.从而关闭文件 29 self.f.close()
30 31 obj=Bar(10,20,r'G:\filename') 32 del obj