面向对象封装特点之一就是通过实现好的方法来访问,限制对数据的不合理访问,把对象状态私有化,仅供类的内部进行操作

下方示例,Test方法的number属性类实例的时候传递1,number是一个公开属性,可以在外部任意修改、访问,没有对属性进行进行约束

class Test:  def __init__(self,number)  self.number = numberif __name__ == '__main__':  test = Test(1)  print(test.number)  test.number = -100  print(test.number) 

@property

@property的作用是声明一个只读属性,在函数上装饰,像调用属性一样的去调用这个函数,对象.属性的方式操作,内部可以做一些逻辑判断,需要注意的两点

  • 调用被装饰方法的时候不+括号
  • 方法定义有且只能有self一个参数
class Test:    def __init__(self, number):        self.__number = number    @property  # 声明number属性,只读    def number(self):        if self.__number >= 100:            raise ValueError('范围超出100')        return self.__numberif __name__ == '__main__':    test = Test(3)      print(test.number)  # 3

@func.setter

setter就是给@property声明的属性设置值,func是当前函数的名字,但是当前函数setter,又需要指向property,所以property声明的函数名 和 setter的函数名需要一致,根据赋值操作还是获取操作决定走哪个方法

class Test:  def __init__(self,number):    self.__number = None      @property # 声明属性  def number(self):    if self.__number >= 100:      raise ValueError('范围超出100')    return self.__number    @number.setter # 设置属性  def number(self,number)  self.__number = number    '''声明和设置属性的函数名字可以完全自定义,但是要与初始化变量名做区分,如果都一样的话会出现同名递归报错'''test = Test()test.number = 30  # setter 设置值print(test.number) #property声明的number获取值

@func.deleter

deleter装饰器见名知意,就是属性的删除操作,实际开发过程中,具体实现的逻辑由我们自己实现,当del属性的时候,会触发该装饰器函数内的流程,但是是否是删除操作,根据业务场景来实现

class Test:    def __init__(self):        self.__number = None    @property    def number(self):        return self.__number    @number.setter    def number(self, number):        self.__number = number    @number.deleter    def number(self):        self.__number = 100if __name__ == '__main__':    test = Test()    test.number = 10    print(test.number)  # 10    del test.number    print(test.number)  # 100'''该示例中,deleter的方法中将number设置为了100,del test.number后触发该流程,所以在deleter做什么事情,由自己决定,可以是 del self.__number 也可有是self.__number=None等等,del只是触发条件'''

property(fget,fset)

除了上面使用装饰器声明,还可有在类中设置属性指向property()对象,设置set和get的方法以及del方法

class Test:    def __init__(self):        self.__number = None    def get_number(self):        return self.__number    def set_number(self, number):        self.__number = number    def del_number(self):        del self.__number    # 设置number属性指向property对象    # fget 获取的时候触发的方法    # fset 赋值的时候触发的方法    # fdel 删除的时候触发的方法    number = property(fget=get_number, fset=set_number, fdel=del_number)if __name__ == '__main__':    test = Test()    test.number = 100    print(test.number)    del test.number

风月都好看,人间也浪漫.