码迷,mamicode.com
首页 > 其他好文 > 详细

property(四十)

时间:2019-03-03 20:18:04      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:set   lex   open   就是   count   play   优先   def   功能   

一个静态属性property本质就是实现了get,set,delete三种方法

用法:

技术图片
class Foo:
    @property
    def AAA(self):
        print(get的时候运行我啊)

    @AAA.setter
    def AAA(self,value):
        print(set的时候运行我啊)

    @AAA.deleter
    def AAA(self):
        print(delete的时候运行我啊)

#只有在属性AAA定义property后才能定义AAA.setter,AAA.deleter
f1=Foo()
f1.AAA
f1.AAA=aaa
del f1.AAA
View Code
技术图片
class Foo:
    def get_AAA(self):
        print(get的时候运行我啊)

    def set_AAA(self,value):
        print(set的时候运行我啊)

    def delete_AAA(self):
        print(delete的时候运行我啊)
    AAA=property(get_AAA,set_AAA,delete_AAA) #内置property三个参数与get,set,delete一一对应

f1=Foo()
f1.AAA
f1.AAA=aaa
del f1.AAA
View Code
技术图片
class Goods:

    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_price


obj = Goods()
obj.price         # 获取商品价格
obj.price = 200   # 修改商品原价
print(obj.price)
del obj.price     # 删除商品原价
View Code
技术图片
#实现类型检测功能

#第一关:
class People:
    def __init__(self,name):
        self.name=name

    @property
    def name(self):
        return self.name

# p1=People(‘alex‘) #property自动实现了set和get方法属于数据描述符,比实例属性优先级高,所以你这面写会触发property内置的set,抛出异常


#第二关:修订版

class People:
    def __init__(self,name):
        self.name=name #实例化就触发property

    @property
    def name(self):
        # return self.name #无限递归
        print(get------>)
        return self.DouNiWan

    @name.setter
    def name(self,value):
        print(set------>)
        self.DouNiWan=value

    @name.deleter
    def name(self):
        print(delete------>)
        del self.DouNiWan

p1=People(alex) #self.name实际是存放到self.DouNiWan里
print(p1.name)
print(p1.name)
print(p1.name)
print(p1.__dict__)

p1.name=egon
print(p1.__dict__)

del p1.name
print(p1.__dict__)


#第三关:加上类型检查
class People:
    def __init__(self,name):
        self.name=name #实例化就触发property

    @property
    def name(self):
        # return self.name #无限递归
        print(get------>)
        return self.DouNiWan

    @name.setter
    def name(self,value):
        print(set------>)
        if not isinstance(value,str):
            raise TypeError(必须是字符串类型)
        self.DouNiWan=value

    @name.deleter
    def name(self):
        print(delete------>)
        del self.DouNiWan

p1=People(alex) #self.name实际是存放到self.DouNiWan里
p1.name=1
View Code

 

property(四十)

标签:set   lex   open   就是   count   play   优先   def   功能   

原文地址:https://www.cnblogs.com/xiangtingshen/p/10467093.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!