property的演示

Posted rxybk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了property的演示相关的知识,希望对你有一定的参考价值。

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的演示的主要内容,如果未能解决你的问题,请参考以下文章

Failed to convert property value of type ‘java.lang.String‘ to required type ‘int‘ for property(代码片段

如何使用 Android 片段?

Vue报错:Uncaught TypeError: Cannot assign to read only property 'exports' of object 的解决方法(代码片段

Xcode 快速开发 代码块

Android课程---Android Studio使用小技巧:提取方法代码片段

Xcode 快速开发 代码块 快捷键