封装和@property
Posted hisweety
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了封装和@property相关的知识,希望对你有一定的参考价值。
通常以下三种情况下用到私用属性和和方法
1.隐藏一个属性,不想让类的外部调用。例如:密码
2.我想保护这个属性,不想让属性随意被改变。例如:某个重要值为数字的属性
3.我想保护这个属性,不被子类继承。比如:密码,或获取重要信息的方法等。
举例:商品价格管理
class Goods:
discount=0.5 def __init__(self,name,price): self.name=name self.__price=price #property仅仅是用于标识这个方法在调用时,可以不用 Goods.price()。直接用Goods.price.即伪装成一个属性值。 #对于返回值为一个看上去像属性的名称时,建议用到这个装饰器。用到这个的同时,相同名称的属性要将其隐藏起来。 @property def price(self): return self.__price*self.discount def set_price(self,new_price): if new_price and type(new_price) is int: #这里保护了输入的数据为合法数据 self.__price=new_price else: print(‘请输入正确的价格数据‘) apple=Goods(‘苹果‘,5) print(apple.price) apple.set_price(8) print(apple.price)
通过对属性的私有保护后,再引入@property,和装饰器 @属性名.setter,则对其属性的值进行修改时进行加工处理。例如下面:
class Person: def __init__(self,name): self.__name=name @property def name(self): #此处用于加工处理属性 return self.__name+‘sb‘ # 此处于用将原属性的值进行修改。之后。如果person.name=‘k’,这个原值将改为k.如果是打印person.name,则走的是上面的property。 @name.setter def name(self,new_name): self.__name=new_name tiger=Person(‘Json‘) print(tiger.name) tiger.name=‘Fanny‘ print(tiger.name)
如果要删除一下私有属性,我们可以加入装饰器 @属性名.deleter,如下
@name.deleter def name(self): del self.__name tiger=Person(‘Json‘) del tiger.name print(tiger.name)
通过del 调用。del 被饰的类名.属性名。注意这三种装饰器。@property @属性名(方法名).setter @属性名(方法名).deleter 都是伪装的。
以上是关于封装和@property的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段14——Vue的axios网络请求封装
Failed to convert property value of type ‘java.lang.String‘ to required type ‘int‘ for property(代码片段
Vue报错:Uncaught TypeError: Cannot assign to read only property 'exports' of object 的解决方法(代码片段