首页 > 其他 > 详细

封装和@property

时间:2019-01-19 10:57:23      阅读:185      评论:0      收藏:0      [点我收藏+]

通常以下三种情况下用到私用属性和和方法

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

原文:https://www.cnblogs.com/hisweety/p/10290448.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!