- 什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性
绑定对象方法解释
绑定到对象方法代表同一个类的方法绑定到不同的对象上,绑定方法会将对象作为self当作参数传入,不同对象的方法内存地址都不一样,绑定方法主要作用于实例化出来的对象
定义绑定对象方法例子class People: #定义类 def __init__(self,name): #初始化对象 self.name = name def run(self): #定义对象方法 print("%s is running!" %self.name) Charl = People("charl") #实例化对象 Charl.run() #执行对象绑定方法 print(Charl.run) #输出绑定对象方法 ''' output: charl is running! #执行绑定对象方法 <bound method People.run of <__main__.People object at 0x7fc***8>> #Charl.run绑定方法 '''
- 什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性
绑定到类方法解释绑定到类的方法很难解释,主要作用在于重构类时在不修改原代码的基础上进一步封装,用@classmethod可以把类作为参数传入到方法内,程序员即可以用传入的类参数在类内部实例化对象,语言解释起来很困难,这里我引用
30daydo
上的例子
常规
建立date对象,实例化时传入日、月、年class Date: def __init__(self,year,month,day): self.year,self.month,self.day = year,month,day def print_date(self): print("year:%s , month:%s , day:%s" %(self.year,self.month,self.day)) date1 = Date(2017, 1, 1) date1.print_date() ''' output: year:2017 , month:1 , day:1 '''
应对用户输入不同的日期字符串
假如用户输入了2017-1-2
这样的字符串,那显然应该对该字符串进行处理,如下:class Date: def __init__(self,year,month,day): self.year,self.month,self.day = year,month,day def print_date(self): print("year:%s , month:%s , day:%s" %(self.year,self.month,self.day)) def format_Date(date_str): #定义方法返回修改后的字符串 return date_str = date_str.split("-") userinput = format_Date("2017-1-2") date2 = Date(userinput[0],userinput[1],userinput[2]) date2.print_date() ''' output: year:2017 , month:1 , day:2 '''
将方法绑定到类,通过类方法来实例化对象
我们可以通过@classmethod将方法写入类里面,通过绑定到类的方法来实例化对象class Date: def __init__(self,year,month,day): self.year,self.month,self.day = year,month,day def print_date(self): print("year:%s , month:%s , day:%s" %(self.year,self.month,self.day)) @classmethod #装饰器将create_date方法绑定到类 def create_date(cls,string_date): #将类作为参数传入 string_date = string_date.split("-") #处理日期字符串 date_obj = cls(string_date[0],string_date[1],string_date[2]) #关键点来了,用传入的类生成一个对象,并且把处理后的输入作为参数传入到对象的初始化方法,赋值给一个date_obj对象 return date_obj #返回生成好的对象 date3 = Date.create_date("2017-1-3") #定义date3,传入用户输入的日期,通过类的create_date类方法实例化对象 date3.print_date() ''' output: year:2017 , month:1 , day:3 '''
- 什么是解除绑定的函数,如何定义,如何调用,给谁用?有什么特性
静态函数解释
解除绑定的函数实为静态及方法
,特点是处于类的命名空间中,但不与对象进行绑定,执行方法不需要实例化对象也可以执行,实例化的对象去执行也不影响,不需要传入self参数即可执行
简写例子, 说明两者关系class foo: def spam(self,x,y,z): print(x,y,z) f1 = foo() f1.spam(1, 2, 3) print(type(f1.spam)) ''' output 1 2 3 <class 'method'> #返回类型为方法 ''' class foo: @staticmethod def spam(x,y,z): print(x,y,z) foo.spam(4, 5, 6) #@staticmethod定义的静态方法,可以不实例化对象直接执行,而对象绑定方法则反之 print(type(foo.spam)) ''' output 4 5 6 <class 'function'> #返回类型为函数 '''
- 什么是property,如何定义,如何使用,给谁用,什么情况下应该将一个属性定义成property,有什么好处?
property解释
property可以将对象的方法定义成属性,@property装饰器将方法作为属性使用,使用property的好处就是对访问的规则进行统一,将逻辑代码隐藏起来,对类的进一步封装
使用例子
建立一个person类,实例化对象传入姓名,性别,性取向,通过性别和性取向能够判断这个人是不是gay or les,用property将status方法封装函数,这样实例化对象后就能得到status值class person: def __init__(self,name,sex,orientation): self.name,self.sex,self.orientation = name,sex,orientation @property def status(self): if self.sex == self.orientation: return "gay" else: return "normal %s" %self.sex someone = person("weien", "male", "male") print(someone.status) ''' output gay '''