Python类的封装

  1. 什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性
    绑定对象方法解释
    绑定到对象方法代表同一个类的方法绑定到不同的对象上,绑定方法会将对象作为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绑定方法
     '''
    
  2. 什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性
    绑定到类方法解释

    python @classmethod 的使用场合

    绑定到类的方法很难解释,主要作用在于重构类时在不修改原代码的基础上进一步封装,用@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 '''
    
  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'> #返回类型为函数
    '''
    
  4. 什么是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
    '''
    

Leave a Reply

Your email address will not be published. Required fields are marked *