property内置装饰器函数和@name.setter@name.deleter

Posted whylinux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了property内置装饰器函数和@name.setter@name.deleter相关的知识,希望对你有一定的参考价值。

# property
    # 内置装饰器函数 只在面向对象中使用
    # 装饰后效果:将类的方法伪装成属性
    # 被property装饰后的方法,不能带除了self外的任何参数


from math import pi
class Circle:
    def __init__(self, r):
        self.r = r
    def perimeter(self):
        return 2 * pi * self.r
    def area(self):
        return pi * self.r**2 * pi

c1 = Circle(5)

# 上面的例子是求一个圆的面积和周长,然而圆的周长和面积其实应该是圆的一个属性,但上面的圆类中没有面积和周长的属性
# 所以我们只能调用元的面积方法然后得到面积值
print(c1.area())
# 但我们可以通过property装饰器将类方法进行装饰,这样调用类方法时,看起来就像是直接调用了属性来得到值,调用方法时方法不用加()
class Circle:
    def __init__(self, r):
        self.r = r
    @property
    def perimeter(self):
        return 2 * pi * self.r
    @property
    def area(self):
        return pi * self.r**2 * pi
c1 = Circle(5)
print(c1.area)  # 246.74011002723395    像直接调用属性一样
print(c1.perimeter) # 31.41592653589793  像直接调用属性一样

# ------------------------------------------------------------------
class Persion:
    def __init__(self, name):
        self.__name = name

    @property
    def name(self):
        return self.__name + sb

tiger = Persion(haha)
print(tiger.name)
#tiger.name = ‘dede‘
# 上面的例子中,我们将name方法伪装成了一个属性,所以我们可以直接像访问属性一样来调用这个方法
# 但是,name虽然被property伪装成了属性,但是却无法tiger.name = ‘dede‘去修改这个name,看样子伪装为属性的感觉
# 还差一点,因为公有属性是可以被修改的,所以使用下面的方法就可以将被property修饰的方法弄成可以修改的操作
class Persion:
    def __init__(self, name):
        self.__name = name
    @property
    def name(self):
        return self.__name + sb
    @name.setter    # name是被property装饰的name,目的是让name可以作为左值,name.setter后,就可以定义一个修改name的方法了,只能接收一个参数,用来作为等号的右值
    def name(self, newName):
        self.__name = newName

tiger = Persion(haha)
print(tiger.name)
tiger.name = dede
print(tiger.name)


# property的应用实例, 超市的水果突然开始打5折
class Goods:
    discount = 0.5
    def __init__(self, name, price):
        self.name = name
        self.__price = price
    @property
    def price(self):
        return self.__price * Goods.discount

apple = Goods(苹果, 5)
print(apple.price)  # 2.5


# --------------------------------------------------------------------
# 删除类的属性和修改类的属性
class Persion:
    def __init__(self, name):
        self.__name = name
    @property
    def name(self):
        return self.__name
    @name.deleter   # 用这个东西装饰后,del p.name后这个被装饰的方法就会被调用
    def name(self):
        del self.__name # 删除属性
    @name.setter    # name.setter后,当name作为左值时,改被装饰的方法被调用,右值作为参数传入到newName
    def name(self, newName):
        self.__name = newName

p = Persion(wer)
print(p.name)   # wer
del p.name  # 删除了Persion中的__name属性
# print(p.name)


# classmethod
# staticmethod

 

以上是关于property内置装饰器函数和@name.setter@name.deleter的主要内容,如果未能解决你的问题,请参考以下文章

python 装饰器:装饰器实例内置装饰器

python 装饰器:装饰器实例内置装饰器

python内置装饰器@property

十四 —— 装饰器

Python装饰器之 property()

Python装饰器之 property()