Python中的get和set方法


眾所周知,像Java,C++這些語言中都有private這種修飾符,一般聲明類的時候,我們都用private聲明一個屬性,然后給它寫一個get方法和一個set方法,可能有人有疑問,為啥不直接寫成public呢?

這個問題我也想過,其實最主要的作用說白了就是一個限制作用,比如:

setAge(int age){
if(age<1||age>120throw new Exception(" 你輸入的年齡不合法");
}else{
  this.age=age;
}

其次的一些作用包括寫上get和set的時候,IDE可以將該類的所有屬性提示出來,不過這是小作用。

那么,在Python中我們怎么寫get和set方法呢?

在說之前,我還是想吐槽,Python設計感覺特別不正規,因為Python中沒有private,屬性前面加個__(兩個下划線)就是私有屬性了,你要是真是也就罷了,實際上呢?就是給人家改個名字。比如:

class AAA(object):
    def __init__(self, name):
        self.__name = name

def main():
    a = AAA('陳馳')
    # print(a.__name) # 這里肯定打印找不到
    print(a.__dict__)
    print(a._AAA__name)

if __name__ == '__main__':
    main()

運行結果:

是不是很low?就給你改了個名字,就變成私有的了。我要是想改, 我只需要

a._AAA__name = '石澤濤'
print(a._AAA__name)
print(a.__dict__)

結果就變成了:

唉,算了算了,今天不吐槽了。這里總結一下Python的get和set方法吧。

傳統寫法

class Money(object):
    def __init__(self):
        self.__money = 0

    def getMoney(self):
        return self.__money

    def setMoney(self, value):
        if isinstance(value, int):
            self.__money = value
        else:
            print("error:不是整型數字")

就是仿照的Java的寫法。

高級寫法1

采用property的類屬性方式:

class Money(object):
    def __init__(self):
        self.__money = 0

    def getMoney(self):
        return self.__money

    def setMoney(self, value):
        if isinstance(value, int):
            self.__money = value
        else:
            print("error:不是整型數字")

    # 定義一個屬性,當對這個money設置值時調用setMoney,當獲取值時調用getMoney
    money = property(getMoney, setMoney)  

a = Money()
a.money = 100  # 調用setMoney方法
print(a.money)  # 調用getMoney方法
#100

高級寫法2

采用property的裝飾器方式:

class Money(object):
    def __init__(self):
        self.__money = 0

    # 使用裝飾器對money進行裝飾,那么會自動添加一個叫money的屬性,當調用獲取money的值時,調用裝飾的方法
    @property
    def money(self):
        return self.__money

    # 使用裝飾器對money進行裝飾,當對money設置值時,調用裝飾的方法
    @money.setter
    def money(self, value):
        if isinstance(value, int):
            self.__money = value
        else:
            print("error:不是整型數字")

a = Money()
a.money = 100
print(a.money)

 


免責聲明!

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



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