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是通过点语法来设置和获取,而上边两类是通过[]方括号来设置和获取
- python中的property属性及魔法属性
- Python 中的 property 属性
- Python 中的 property 属性
- Python 中的 property 属性
- 浅谈Python中的 property属性
- Python魔法方法--属性
- python中魔法属性和魔法方法
- Python 魔法方法与属性
- python Property属性用法
- python Property属性用法
- python Property属性用法
- python property属性
- Python property,属性
- python Property属性用法
- python---property属性
- python-@property 属性
- Python属性函数property
- Delphi 中的属性property
- 关于for循环的执行效率问题
- C语言例题
- STL源码剖析——RB_TREE
- The basic of Java -- Abstract, Interface, Polymorphism, Inheritance, Wrap, Lambda(day 05)
- 写好一份技术简历很重要
- python中的property属性及魔法属性
- 剑指offer — 最小的k个数
- mybatis代码自动生成Demo(maven项目)
- 移动端(二)——移动端适配方案
- redis_持久化
- PAT (Basic Level) Practise (中文) 1076. Wifi密码 (15)
- LightOJ
- linux系统下安装nodejs并配置环境
- 欢迎使用CSDN-markdown编辑器