python的裝飾器 property介紹

2021-09-12 20:14:42 字數 1982 閱讀 1944

今天介紹一下python的裝飾器,先看乙個例子

import traceback

class screen(object):

@property

def width(self):

return self._width

@width.setter

def width(self, width):

if isinstance(width, str):

raise valueerror('width can not be string!')

self._width = width

@property

def height(self):

return self._height

@width.setter

def height(self, height):

if isinstance(height, str):

raise valueerror('height can not be string!')

self._height = height

@property

def resolution(self):

self._resolution = self._width * self._height

return self._resolution

s = screen()

s.width = 75

s.height = 20

print(s.resolution)

>>>1500

再看下面:

try:

s.width = 'abc'

except valueerror:

traceback.print_exc()

try:

s.resolution = 1500

except attributeerror:

traceback.print_exc()

>>>traceback (most recent call last):

file "", line 2, in s.width = 'abc'

file "", line 11, in width

raise valueerror('width can not be string!')

valueerror: width can not be string!

>>>traceback (most recent call last):

file "", line 6, in s.resolution = 1500

attributeerror: can't set attribute

在繫結屬性時,如果我們直接把屬性暴露出去,雖然寫起來很簡單,但是,沒辦法檢查引數,導致可以隨便改:

有沒有既能檢查引數,又可以用類似屬性這樣簡單的方式來訪問類的變數呢?

裝飾器(decorator)可以給函式動態加上功能,對於類的方法,裝飾器一樣起作用。python內建的@property裝飾器就是負責把乙個方法變成屬性呼叫的:

注意到這個神奇的@property,我們在對例項屬性操作的時候,就知道該屬性很可能不是直接暴露的,而是通過getter和setter方法來實現的。

@property的實現比較複雜,我們先考察如何使用。把乙個getter方法變成屬性,只需要加上@property就可以了,此時,@property本身又建立了另乙個裝飾器@width.setter負責把乙個setter方法變成屬性賦值,於是,我們就擁有乙個可控的屬性操作:

還可以定義唯讀屬性,只定義getter方法,不定義setter方法就是乙個唯讀屬性

上例中我們利用@property給乙個screen物件加上width和height屬性,以及乙個唯讀屬性resolution

@property廣泛應用在類的定義中,可以讓呼叫者寫出簡短的**,同時保證對引數進行必要的檢查,這樣,程式執行時就減少了出錯的可能性。

python裝飾器 Python 裝飾器

簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...

python裝飾器 裝飾器

由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...

python裝飾器原理 Python裝飾器原理

裝飾器 decorator 是物件導向設計模式的一種,這種模式的核心思想是在不改變原來核心業務邏輯 的情況下,對函式或類物件進行額外的修飾。python中的裝飾器由python直譯器直接支援,其定義形式如下 decorator def core service 要理解上述 的含義,我們從自定義函式裝...