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

property的演示

时间:2020-07-11 15:33:30      阅读:48      评论:0      收藏:0      [点我收藏+]

标签:attr   原理   修改   func   输入   通过   res   __init__   set   

class Room:
    def __init__(self,name,length,width):
        self.name=name
        self.length=length
        self.width=width
    @property
    def test(self):
        return self.length*self.width
f=Room("123",1,1)
print(f.test)  #1 

@property 的方法可以输入return的内容 从而隐藏函数的逻辑

如果没有@property这个,那我我们调用应该是

print(s.test())这样子调用

 

 

自定义@property的方法

实际上@property方法==》函数名=property(函数名)

class testproperty:
    def __init__(self,func):
        self.func=func
    def __get__(self, instance, owner):
        print("--------")
        if instance==None:
            return  self
        res=self.func(instance) #直接设置实例属性,待日后用到时不需要再次计算即可得到
        setattr(instance,self.func.__name__,res)  #这步是重点
        return res
    ‘‘‘
    并没有__set__方法则实例大于非数据描述符 则会先调用实例属性
    如果使用__set__方法那么数据描述符大于实例则在setattr中使用无效
    ‘‘‘


class Room:
    def __init__(self,name,length,width):
        self.name=name
        self.length=length
        self.width=width
    @testproperty #  test=testproperty(test)   和property效果一样
    def test(self):
        return self.length*self.width

s=Room("123",1,1)
print(s.test)

好了上面就是property的原理。那么干什么用的?

就是如果在__get__中的逻辑复杂,那么使用这段代码

setattr(instance,self.func.__name__,res)

下次如果在次使用就不用通过上面继续使用复杂逻辑,

而直接使用上一次计算的值即可,提高速度

 

 

property的补充

class foo:
    @property
    def AAA(self):
        print("get的时候运行我")
    @AAA.setter
    def AAA(self,val):
        print("set的时候运行",val)
    @AAA.deleter
    def AAA(self):
        print("del的时候运行我")

a=foo()
a.AAA
a.AAA=10
del a.AAA

#get的时候运行我
#set的时候运行 10
#del的时候运行我

另一种写法:

class foo:
    def get_AAA(self):
        print("get的时候运行我")
    def set_AAA(self,val):
        print("set的时候运行",val)
    def del_AAA(self):
        print("del的时候运行我")
    AAA=property(get_AAA,set_AAA,del_AAA)

a=foo()
a.AAA
a.AAA=10
del a.AAA

 

实例演示:

这个是卖东西修改价格

class Test:
    def __init__(self):
        self.price=100
        self.discount=0.8
    @property
    def price1(self):
        res=self.price*self.zk
        return res
    @price1.setter
    def price1(self,val):
        self.price=val

    @price1.deleter
    def price1(self):
        del self.price

s=Test()
print(s.price1)
s.price1=200
print(s.price1)
del s.price1

 

property的演示

标签:attr   原理   修改   func   输入   通过   res   __init__   set   

原文地址:https://www.cnblogs.com/rxybk/p/13283690.html

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