浅谈Python中的 property属性

来源:互联网 发布:linux重启tomcat命令 编辑:程序博客网 时间:2024/06/09 09:59

1.什么是property属性

一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法
class Foo:    def func(self):        pass    # 定义property属性    @property    def prop(self):        pass"""调用"""foo_obj = Foo()foo_obj.func()  # 调用实例方法foo_obj.prop  # 调用property属性

2.property属性的调用需要注意以下几点

  • 定义时,在实例方法的基础上添加@property装饰器,并且仅有一个self参数
  • 调用时,不需要添加()

3.property属性的两种方式

  • 装饰器,即在方法上使用装饰器
  • 类属性,即在类中定义值为property对象的类属性

3.1 装饰器方式

在类的实例方法上应用@property装饰器Python中的类有经典类和新式类,新式类的属性比经典类的属性丰富。( 如果类继object,那么该类是新式类 )Python 2.x中默认都是经典类,只有显式继承了object才是新式类Python 3.x中默认都是新式类,不必显式的继承object

经典类,具有一种@property装饰器

class Goods:    # 定义property 属性    @property    def price(self):        return "zhaosi""""调用"""obj = Goods()result = obj.price  # 自动执行 @property 修饰的 price 方法,并获取方法的返回值print(result)

新式类,具有三种@property装饰器

class Goods:    """python3中默认继承object类        以python2、3执行此程序的结果不同,因为只有在python3中才有@xxx.setter  @xxx.deleter    """    @property    def price(self):        print('@property')    @price.setter    def price(self, value):        print('@price.setter')    @price.deleter    def price(self):        print('@price.deleter')"""调用"""obj = Goods()obj.price          # 自动执行 @property 修饰的 price 方法,并获取方法的返回值obj.price = 123    # 自动执行 @price.setter 修饰的 price 方法,并将  123 赋值给方法的参数del obj.price      # 自动执行 @price.deleter 修饰的 price 方法

由于新式类中具有三种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除

3.2 类属性方式,创建值为property对象的类属性

当使用类属性的方式创建property属性时,经典类和新式类无区别
class Foo:    def get_bar(self):        return 'zhaosi'    BAR = property(get_bar)obj = Foo()reuslt = obj.BAR  # 自动调用get_bar方法,并获取方法的返回值print(reuslt)

property方法中有个四个参数

  • 第一个参数是方法名,调用 对象.属性 时自动触发执行方法
  • 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
  • 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
  • 第四个参数是字符串,调用 对象.属性.doc ,此参数是该属性的描述信息
class Foo(object):    def get_bar(self):        print("getter...")        return 'zhaosi'    def set_bar(self, value):         """必须两个参数"""        print("setter...")        return 'set value' + value    def del_bar(self):        print("deleter...")        return 'zhaosi'    BAR = property(get_bar, set_bar, del_bar, "description...")obj = Foo()obj.BAR  # 自动调用第一个参数中定义的方法:get_barobj.BAR = "alex"  # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入desc = Foo.BAR.__doc__  # 自动获取第四个参数中设置的值:description...print(desc)del obj.BAR  # 自动调用第三个参数中定义的方法:del_bar方法

由于类属性方式创建property属性具有3种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除

原创粉丝点击