类中定义函数分为了两大类:
1.绑定方法:
特殊之处:绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入
如何用:
绑定给对象的方法:在类中定义函数没有被任何装饰器修饰的情况下,默认就是绑定对象的
绑定给类的方法:为类中定义函数添加一个装饰器classmethod,就是绑定类的
2.非绑定方法:
特殊之处:
非绑定方法就是一个普通函数,既不与类绑定又不与对象绑定,意味着类与对象都可以调用,但是无论谁来调用都是一个普通函数,没有自动传值的效果
如何用:
非绑定方法:为类中定义函数添加一个装饰器 staticmethod 就是非绑定方法
三种方法使用:关键看函数体的代码具体使用情况
import uuid
print(uuid.uuid4())
1.绑定给对象的方法
绑定给对象的,应该由对象来调,
obj.func()
print(obj)
绑定给对象的方法:类也可以调用,但是类调用就是一个普通函数,没有自动传值的效果
print(obj.func1)
print(Foo.func1)
Foo.func1(obj)
2.绑定给类的方法
绑定给类的,应该由类来调用(如用对象来调用,自动传的还是类)
print(Foo.func2)
print(obj.func2)
Foo.func2()
obj.func2()
3.非绑定方法
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,'xxx',None)
delattr 删除
delattr(obj,'name')
# 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