# 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
