日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python property setter_Python:动态属性 property setter 以及 __getattr__ 属性

發布時間:2023/12/4 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python property setter_Python:动态属性 property setter 以及 __getattr__ 属性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. property

引言:

-- 假設有這樣一個需求,我們需要創建一個 User 類,并初始化 birthday 參數,之后根據 birthday 計算得到年齡;

-- 我們設計下面的代碼實現該需求:

>>> from datetime import date, datetime

>>>

>>>

>>> class User():

... def __init__(self, nbirthday):

... self.birthday = birthday

... def get_age(self):

... return datetime.now().year - self.birthday.year

...

>>>

>>> user = User(date(year=1990, month=3, day=5))

>>> age = user.get_age()

>>> print(age)

30

-- 上面的代碼中使用 user 實例調用 get_age() 方法獲取 age,但是這種方法并不是常規方法,我們習慣用類似于 user.age 這樣的方式獲取 age;

property

-- 于是我們引入 property 屬性,將 age() 方法變為實例的一個 age 屬性,這樣就可以通過 user.age 直接調用,代碼如下:

>>> from datetime import date, datetime

>>>

>>>

>>> class User():

... def __init__(self, birthday):

... self.birthday = birthday

... @property

... def age(self):

... return datetime.now().year - self.birthday.year

...

>>>

>>> user = User(date(year=1990, month=3, day=5))

>>> print(user.age)

30

2. setter

引言

-- 假設有這樣一個需求,我們需要創建一個 User 類,初始化屬性 age 默認為 0,之后改變 age 的值,并獲取該值;

-- 我們設計下面的代碼實現該需求:

>>> class User():

... def __init__(self):

... self.age = 0

... def set_age(self, age):

... self.age = age

...

>>>

>>> user = User("zhang")

>>> user.set_age(30)

>>> print(user.age)

30

-- 上面的代碼中使用 user 實例調用 set_age() 方法賦值于 age,但是這種方法并不是常規方法,我們習慣用類似于 user.age = xxx 這樣的方式賦值 age;

setter

-- 于是我們引入 setter 屬性,這樣就可以通過 user.age 直接賦值,代碼如下:

>>> class User():

... def __init__(self,):

... self._age = 0

... @ property

... def age(self):

... return self._age

... @age.setter

... def age(self, age_value):

... self._age = age_value

...

>>>

>>> user = User()

>>> user.age = 30

>>> print(user.age)

30

3. __ getattr __

引言

-- 在開發過程中,我們經常需要設計并獲取類的實例對象的屬性,但有時會因為疏忽遺漏沒有為類設計某個屬性,這就導致獲取屬性值的實收出現報錯,故而造成程序異常甚至崩潰;

-- 如下面的代碼:

>>> class User():

... def __init__(self, name):

... self.name = name

...

>>>

>>> user = User(name="zhangsan")

>>> print(user.age)

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'User' object has no attribute 'age'

__ getattr __ 處理 object has no attribute 報錯

-- 如上面的代碼,User 類并沒有 age 屬性,所以在實例 user 獲取 age 屬性時遇到報錯,這個時候需要用到 __ getattr __ 解決此問題;

>>> class User():

... def __init__(self, name):

... self.name = name

... def __getattr__(self, item): # 注意:此處 item 不能少

... pass

...

>>>

>>> user = User(name="zhangsan")

>>> print(user.age)

None

-- 在上面的代碼中,User 類并沒有 age 屬性,所以在實例 user 獲取 age 屬性時并未報錯,而只是反悔了一個 None,這就有效避免了報錯;

__ getattr __ 獲取 dict 類型屬性的 value 值

-- 除了上面的用法,__ getattr __ 還可以用來更好的獲取 dict 類型屬性的 value 值;

-- 比如我們初始化類時給與其一個 dict 字典屬性參數,我們希望可以通過 實例. 屬性(比如 user.age)的方式直接獲取 dict 字典中 key 為 age 的 value 值;

-- 以下面的代碼為例:

>>> class User():

... def __init__(self, info={}):

... self.info = info

... def __getattr__(self, item):

... if not item in self.info.keys():

... return None

... return self.info[item]

...

>>>

>>> user = User({"name":"zhangsan", "age":23})

>>> print(user.age)

23

>>> print(user.gender)

None

-- 代碼中 user.age 的方式直接獲取初始化參數 dict 字典中 key 為 age 的 value 值 23,同時 dict 中并未有 key 為 gender 的鍵值對,user.gender 直接返回 None 而并未出現報錯;

總結

以上是生活随笔為你收集整理的python property setter_Python:动态属性 property setter 以及 __getattr__ 属性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。