property裝飾器

2022-01-15 world of statistics
前言

最近在查看一些源碼的時候,會經常遇到@property,感覺很有意思,但是不太懂什麼意思。

看了兩篇文章之後,把@property和@setter都搞懂了,這裡給大家分享這兩篇文章。

https://zhuanlan.zhihu.com/p/64487092  這個連結只是介紹了@property。但是把它介紹的非常透徹。讓大家一下就能看懂這個是什麼意思。https://www.liaoxuefeng.com/wiki/1016959663602400/1017502538658208 這個連結是廖雪峰寫的,這個不僅介紹了@property,還介紹了@setter。

如果是小白的話,直接看2,可能會很懵逼。因為2寫的實在是太亂了(其實叫寫的非常全面),他把兩個屬性放在一起寫了,導致小白轉不過來。

但是先看1,再看2就很清晰了。因為看懂了1,然後就基本上對@property非常了解了,然後再看看連結2,就更加了解了@setter了。

先介紹@property轉載連結:https://zhuanlan.zhihu.com/p/64487092內容

python的@property是python的一種裝飾器,是用來修飾方法的。

我們可以使用@property裝飾器來創建只讀屬性,@property裝飾器會將方法轉換為相同名稱的只讀屬性,可以與所定義的屬性配合使用,這樣可以防止屬性被修改。

使用場景:1.修飾方法,是方法可以像屬性一樣訪問。
class DataSet(object):
  @property
  def method_with_property(self): ##含有@property
      return 15
  def method_without_property(self): ##不含@property
      return 15

l = DataSet()
print(l.method_with_property) # 加了@property後,可以用調用屬性的形式來調用方法,後面不需要加()。
print(l.method_without_property())  #沒有加@property , 必須使用正常的調用方法的形式,即在後面加()

兩個都輸出為15。

class DataSet(object):
  @property
  def method_with_property(self): ##含有@property
      return 15
l = DataSet()
print(l.method_with_property()) # 加了@property後,可以用調用屬性的形式來調用方法,後面不需要加()。

如果使用property進行修飾後,又在調用的時候,方法後面添加了(), 那麼就會顯示錯誤信息:TypeError: 'int' object is not callable,也就是說添加@property 後,這個方法就變成了一個屬性,如果後面加入了(),那麼就是當作函數來調用,而它卻不是callable(可調用)的。

class DataSet(object):
  def method_without_property(self): ##不含@property
      return 15
l = DataSet()
print(l.method_without_property) #沒有加@property , 必須使用正常的調用方法的形式,即在後面加()

沒有使用property修飾,它是一種方法,如果把括號去掉,不會報錯輸出的就會是方法存放的地址。

2.與所定義的屬性配合使用,這樣可以防止屬性被修改。

由於python進行屬性的定義時,沒辦法設置私有屬性,因此要通過@property的方法來進行設置。這樣可以隱藏屬性名,讓用戶進行使用的時候無法隨意修改。

class DataSet(object):
    def __init__(self):
        self._images = 1
        self._labels = 2 #定義屬性的名稱
    @property
    def images(self): #方法加入@property後,這個方法相當於一個屬性,這個屬性可以讓用戶進行使用,而且用戶有沒辦法隨意修改。
        return self._images 
    @property
    def labels(self):
        return self._labels
l = DataSet()
#用戶進行屬性調用的時候,直接調用images即可,而不用知道屬性名_images,因此用戶無法更改屬性,從而保護了類的屬性。
print(l.images) # 加了@property後,可以用調用屬性的形式來調用方法,後面不需要加()。

介紹@setter

這裡提供一個非常簡單的案例,就可以幫助大家了解了@setter屬性:


class Student(object):
    def __init__(self):
        self.age_number = None

    @property
    def age(self):
        return self.age_number

    @age.setter # 這個age是來自於上面那個age函數
    def set_age(self, age):
        self.age_number = age


student1 = Student()
student1.set_age = 20 # 注意到上面對set_age做了@age.setter之後,我們可以使用student1.set_age = 20 而不是student1.set_age(20)
student1.age

總結@property是將一個方法可以當成這個類的一個屬性,也就是你可以通過這個出口,從外部獲得這個類裡面的數據,而且不可以通過這個出口修改類裡面的任何數據。說白了,就是只讀。@setter是和上面差不多,唯一不同的就是擁有寫入功能。閱讀更多






相關焦點

  • 詳解Python的裝飾器
    format(something)內置的裝飾器內置的裝飾器和普通的裝飾器原理是一樣的,只不過返回的不是函數,而是類對象,所以更難理解一些。@property在了解這個裝飾器前,你需要知道在不使用裝飾器怎麼寫一個屬性。def getx(self):    return self.
  • Decorator-裝飾器
    裝飾器是一種函數,寫成@ + 函數名。
  • (長文收藏) 如何理解 Python 裝飾器?
    裝飾器的辦法,定義一個專門日誌記錄的裝飾器,對需要的函數進行裝飾。4.內置裝飾器Python中有三種我們經常會用到的裝飾器, property、 staticmethod、 classmethod,他們有個共同點,都是作用於類方法之上。
  • 「小白系列」 Python 中的 slots 和 property
    所以 @property 的出現就解決了這個問題。@property 是一個裝飾器,用來負責把一個方法變成屬性調用。例如:Class  Book(object):  @property  def year(self):    return self.
  • 活用async/await,讓Vue變得更好用的裝飾器!
    要求被裝飾的方法必須寫成async/await,用起來十分方便,實現徹底被隱藏在了裝飾器內部。前兩個都是用在ts環境下class寫法的vue裡的。不過看清楚邏輯後,很容易修改成可以用在js環境中的vue組件上。1. 給vue添加一個指示初始化完成的變量。
  • 活用 async/await ,讓 Vue 變得更好用的裝飾器!
    ↓推薦關注↓下文三個裝飾器,都是利用了async/await把異步變成同步的特性實現的
  • 第57p,裝飾器魔法糖,多個裝飾器的使用
    一、裝飾器的魔法「糖」1、用法在Python中提供了一個裝飾器的簡潔用法,即:在需要被裝飾的方法前面@裝飾器名稱即可;用法:@裝飾器名稱被裝飾對象例如:@inner 這一句就等同於fun = inner(fun);2、執行過程@裝飾器名稱當Python解釋器遇到@時,會將被裝飾對象當作參數,傳遞給裝飾器,並將最終的賦值返回給被裝飾對象
  • 一文搞定Python裝飾器,看完面試不再慌
    我看網上的面經說到Python經常會問裝飾器,我當時想的是裝飾器我已經看過了,應該問題不大……沒想到面試的時候還真的問到了,面試官問我Python當中的裝飾器是什麼。由於緊張和遺忘,我支支吾吾了半天也沒答上來。
  • 一文讀懂Python裝飾器
    打開APP 一文讀懂Python裝飾器 工程師3 發表於 2018-04-28 10:48:00 談裝飾器前,還要先要明白一件事,Python 中的函數和 Java、C++不太一樣,Python 中的函數可以像普通變量一樣當做參數傳遞給另外一個函數,例如:
  • Python裝飾器以及高級用法
    介紹首先我要承認,裝飾器非常難!你在本教程中看到的一些代碼將會有一些複雜。大多數人在學習Python時都跟裝飾器做過鬥爭,所以如果這對你來說很奇怪,不要感到沮喪,因為同樣的大多數人都可以克服這種苦難。在本教程中,我將逐步介紹了解裝飾器的過程。首先我假設你已經可以編寫基本函數和基本類。
  • Python 的lru_cache裝飾器使用簡介
    1 從示例說起2 優化3 比較4 lru_cache 裝飾器Python 的 lru_cache 裝飾器是一個為自定義函數提供緩存功能的裝飾器。運行結果:使用了 lru_cache 裝飾器之後,這個遞歸函數只需調用 100 多次fibonacci() 函數!性能有了質的提升。
  • Python編寫裝飾器,給任意函數計時
    # 2、編寫裝飾器def time_logger(func): @functools.wraps(func) def wrapper_timer(*args, **kwargs): logging.info(f"BeginFunction {func.__name__!
  • Python退避及重試裝飾器:backoff
    退避和重試的函數裝飾器此模塊提供函數裝飾器,該函數裝飾器可用於包裝函數,以便函數重試直到滿足某些條件為止。當訪問可能出現間歇性故障的不可靠資源(如網絡資源和外部API)時,它應該有用。一般來說,它還可以用於外部生成內容的動態輪詢資源。
  • Python遞歸函數、閉包和裝飾器
    目錄:一、遞歸函數二、閉包的深入講解三、裝飾器的使用一、 遞歸函數外部函數返回值必須是內嵌函數 通過這三點,就可以創建一個閉包,提別注意:Python裝飾器就是使用了閉包。decorators(專業提高篇)裝飾器的定義裝飾器是程序開發中經常會用到的一個功能,用來在原有的函數上增添新的代碼需求。
  • 簡單 12 步理解 Python 裝飾器
    作為 Python 教師,我發現理解裝飾器是學生們從接觸後就一直糾結的問題。那是因為裝飾器確實難以理解!想弄明白裝飾器,需要理解一些函數式編程概念,並且要對Python中函數定義和函數調用語法中的特性有所了解。使用裝飾器非常簡單(見步驟10),但是寫裝飾器卻很複雜。雖然我沒法讓裝飾器變得簡單,但也許通過將問題進行一步步的講解,可以幫助你更容易理解裝飾器。
  • 人人都能看懂的 Python 裝飾器入門教程!
    但很多教程在一上來就會給出裝飾器的定義以及基本用法,例如你一定會在很多文章中看到例如代碼運行時間計時器等相關常用裝飾器。本文我將嘗試說清楚為什麼需要現裝飾器、什麼是裝飾器、以及如何寫一個簡單的裝飾器,但要徹底理解裝飾器還要從函數開始說起,下面是有關函數的四個重要的概念,希望大家可以明白。
  • 使用python強大的裝飾器,監控數據自動化流程日誌
    裝飾器是python當中的進階用法,並且應用非常廣泛,但是在實際的工作過程中,我發現很多人常常因為覺得裝飾器很複雜,望而生畏。實際上從原理來講並不難。這一節,我會從函數為切入點,引出裝飾器的概念和基本用法,最後再結合我們的數據自動化程序,這個實際的例子,讓大家能夠使數據自動化程序功能更加的完善,並且學會裝飾器的用法,先來看一下,最終釘釘報警的效果:釘釘報警效果1、函數核心知識點第一點:函數可以作為對象,賦予給變量函數作為對象這裡把func這個函數,賦值給了send_message
  • 一文讀懂python裝飾器由來(二)
    --  Illustrations by Charlie Davis  --上一篇文章主要以一步一步演進的方式介紹了裝飾器的工作原理以及使用