类中定义函数分为了两大类: 1.绑定方法 特殊之处:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数自动传入 绑定给对象的方法:在类中定义函数没有被任何装饰器的情况下,默认就是绑定对象的 绑定给类的方法:为类中定义函数添加一个装饰器class method,就是绑定类的 2.非绑定方法 特殊之处:非绑定方法就是一个普通函数,既不与绑定又不与对象绑定,意味着类与对象都可以调用,但是无论谁来调用都是一个普通函数,没有自动传值效果 非绑定方法:为类中定义函数添加一个装饰器static method,就是非绑定方法
# 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() #一.绑定给对象的方法 # 绑定给对象的,应该由对象来调, # 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) 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()反射指的是通过字符串来操作属性
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__)