python中的property属性及魔法属性

来源:互联网 发布:微信浏览器打开淘宝 编辑:程序博客网 时间:2024/05/29 07:11

property属性

通过以下代码来认识一下property

class Foo:    def func(self):        pass    # 定义property属性    @property    def prop(self):        pass

可以使方法使用起来就像使用属性一样方便,通过装饰器的使用实现的这种情况

  • 此属性有两种方式
  • 装饰器实现
class Goods(object):    def __init__(self):        # 原价        self.original_price = 100        # 折扣        self.discount = 0.8    @property    def price(self):        # 实际价格 = 原价 * 折扣        new_price = self.original_price * self.discount        return new_price    @price.setter    def price(self, value):        self.original_price = value    @price.deleter    def price(self):        del self.original_priceobj = Goods()obj.price         # 获取商品价格obj.price = 200   # 修改商品原价del obj.price     # 删除商品原价
  • 类属性实现
class Foo(object):    def get_bar(self):        print("getter...")        return 'wang'    def set_bar(self, value):         """必须两个参数"""        print("setter...")        return 'set value' + value    def del_bar(self):        print("deleter...")        return 'wang'    BAR = property(get_bar, set_bar, del_bar, "description...")obj = Foo()obj.BAR  # 自动调用第一个参数中定义的方法:get_barobj.BAR = "jack"  # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入desc = Foo.BAR.__doc__  # 自动获取第四个参数中设置的值:description...print(desc)del obj.BAR  # 自动调用第三个参数中定义的方法:del_bar方法

以上两种方式的setter方法中都需要有两个参数,self指向对象,而另外一个是要接收外界使用赋值运算设置的值。
这个属性设定的使用方式感觉很像字典的操作的使用方式,以点取值,以等号赋值

在私有属性中的使用

class Money(object):    def __init__(self):        self.__money = 0    @property    def money(self):        return self.__money    @money.setter    def money(self, value):        self.__money = valuesalary = Money()print(salary.money)salary.money = 20000print(salary.money)

魔法属性方法

__str__ 返回一个描述性信息,必须是字符串,当创建对象时,此方法就存在返回值了,在外界可以使用print(obj)查看,也可以使用格式化字符串来查看。

__init__ 初始化实例对象,不要对其称呼构造函数,在python中创建对象调用的是__new__ 方法,此方法为对象开辟内存空间,并返回对象的引用,之后才是init的初始化,两者合起来倒可称呼为构造函数

__del__ 当对象在内存中被释放时,自动触发执行

__call__ 定义此方法后,实例对象后直接加小括号就可以直接执行,执行的就是此方法内代码

外界可以使用(对象.属性)进行访问并有返回值的属性

__module__ 查看当前操作的对象在哪个模块中,不带括号调用

__class__ 查看对象由哪个类创建,不带括号调用

__dict__ 查看实例对象或类对象拥有的属性和方法 ,不带括号调用

__doc__ 查看实例对象或类对象的文档描述,不带括号调用

特殊的几个方法

  • __getitem__、__setitem__、__delitem__

用于索引操作,如字典。以上分别表示获取、设置、删除数据,示例如下:

class Foo(object):    def __init__(self):        self.key = None        self.value = None        self.dict = dict()    def __getitem__(self, key):        """调用后可以获得外界传入的key"""        # print("这里的代码应该有返回值供外界查看%s" % key)        return self.dict[key]    def __setitem__(self, key, value):        self.dict[key] = value    def __delitem__(self, key):        del self.dict[key]f = Foo()f["name"] = "rose"print(f["name"])f["age"] = 18print(f["age"])del f["name"]print(f["name"])
  • __getslice__、__setslice__、__delslice__

该三个方法用于分片操作,如:列表

class Foo(object):    def __getslice__(self, i, j):        print('__getslice__', i, j)    def __setslice__(self, i, j, sequence):        print('__setslice__', i, j)    def __delslice__(self, i, j):        print('__delslice__', i, j)obj = Foo()obj[-1:1]                   # 自动触发执行 __getslice__obj[0:1] = [11,22,33,44]    # 自动触发执行 __setslice__del obj[0:2]                # 自动触发执行 __delslice__

以上两类特殊的方法,看起来和property很类似,都是设置,获取,删除三项操作,property是通过点语法来设置和获取,而上边两类是通过[]方括号来设置和获取

原创粉丝点击