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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM