property(四十)

Posted xiangtingshen

tags:

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

一个静态属性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(四十)的主要内容,如果未能解决你的问题,请参考以下文章

Unity HTFramework框架(四十)Debug的性能监控

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

shell学习四十九天----进程建立

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

Xcode 快速开发 代码块

Xcode 快速开发 代码块 快捷键