目录:
绑定与非绑定方法:
类中定义函数分为了两大类: 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.pyIP='10.10.0.11'PORT=3307
import settingsclass 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 Trueclass Foo: pass obj=Foo()print(isinstance(obj,Foo))#True# issubclass()判断是否是某个类的子类class Foo: passclass 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=x24 self.y=y25 # 打开一个文件,没有关闭26 self.f=open(filepath,'r',encoding='utf-8')27 def __del__(self):28 # 写回收系统资源相关的代码,在程序结束时自动执行.从而关闭文件29 self.f.close() 3031 obj=Bar(10,20,r'G:\filename')32 del obj