1. 程式人生 > >Python中,關於@property裝飾器

Python中,關於@property裝飾器

per password none use 同名 erp 相對 內容 密碼

1.為什麽使用@property裝飾器?在類中,當我麽不想在外界直接調用到類的屬性,或者不想展示屬性的真實內容時,可以用到@property。
br/>在類中,當我麽不想在外界直接調用到類的屬性,或者不想展示屬性的真實內容時,可以用到@property。

2.我們為什麽不使用特定的方法來進行上面的操作?
原因是因為太繁瑣。例:

class Person:
    def __init__(self, username, password) -> None:
        self.username = username
        self.__password = password

    def get_password(self):
        return self.__password

    def set_password(self, password):
        self.__password = password

p = Person("大狗", "123456")
print(p.get_password())

我們通過聲明特別的方法來管理我們隊屬性的獲取與設置,但在外界調用時會凸顯出這是一個方法,而不是一個屬性,這違背了我們想要隱匿屬性的初衷,並且顯得很繁瑣。
3.當我們不想讓調用者通過對象名.屬性直接獲取屬性時,就可以使用@perproty裝飾器。例:

class Person:
    def __init__(self, username, password) -> None:
        self.username = username
        self.__password = password

    @property
    def password(self):
        return self.__password

    @password.setter
    def password(self, password):
        self.__password = password

p = Person("大狗", "123456")
print(p.password)

定義屬性的同名方法(不要設置成私有方法(__password()),這樣會和屬性名完全一致,在類內部會出現超出最大遞歸深度的錯誤,這是一個大坑...
在用@property裝飾器裝飾一個方法後,@property會自動設置一個@方法名.stetter的裝飾器,用來幫助我們設置屬性,如上代碼所示。我們可以測試一下

class Person:
    def __init__(self, username, password) -> None:
        self.username = username
        self.__password = password

    @property
    def password(self):
        print(" in @property")
        return self.__password

    @password.setter
    def password(self, password):
        print("in setter")
        self.__password = password

p = Person("大狗", "123456")
print(p.password)
p.password = "654321"
print(p.password)

輸出:

in @property
123456
in setter
in @property
654321

可以看到,我們不管用對象名.屬性的方法設置屬性或者獲取屬性都是通過調用相對應的方法來進行處理,這樣在外部調用者就不知道時真的調用的屬性還是方法,很好的隱匿可保護了我們的屬性。在屬性方法中我們還可以做一些特別的操作。例:

class Person:
    def __init__(self, username, password) -> None:
        self.username = username
        self.__password = password

    @property
    def password(self):
        # print(" in @property")
        return "該屬性不對外展示"

    @password.setter
    def password(self, password):
        # print("in setter")
        self.__password = "加密後的:" + password

p = Person("大狗", "123456")
print(p.password)
p.password = "654321"
print(p.__dict__)

輸出:

該屬性不對外展示
{‘username‘: ‘大狗‘, ‘_Person__password‘: ‘加密後的:654321‘}

我們不對外展示密碼,只進行密碼的加密存儲。這樣就很好的保護了該屬性。
歡迎留言。

Python中,關於@property裝飾器