天天看點

python的property屬性

1、什麼是property屬性

一種用起來像是使用的執行個體屬性一樣的特殊屬性,可以對應于某個方法

# ############# 定義 ##############
class Foo:
    def fun(self):
        pass

    # 定義property屬性,必須傳回一個值
    @property
    def prop(self):
        return 100

# ############# 調用 ################
foo_obj = Foo()
foo_obj.fun()  # 調用執行個體方法
print(foo_obj.prop)  # 調用屬性
           

property屬性的定義和調用要注意以下幾點:

  • 定義時,在執行個體方法的基礎上添加

    @property

    裝飾器,并且僅有

    self

    一個參數
  • 調用時,無需括号
方法: foo_obj.func()
property屬性:foo_obj.prop
           

2、簡單的執行個體

對于京東商城中顯示電腦主機的清單頁面,每次請求不可能把資料庫中的所有内容都顯示到頁面上,而是通過分頁的功能局部顯示,是以在向資料庫中請求資料時就要顯示的指定擷取從第m條到第n條的所有資料,這個分頁的功能包括:

  • 根據使用者請求的目前頁和總資料條數計算出m和n
  • 根據m和n去資料庫中請求資料
class Pager:
    def __init__(self, current_page):
        # 使用者請求目前的頁碼(第一頁,第二頁。。。)
        self.current_page = current_page
        # 每頁預設顯示10條資料
        self.per_items = 10

    @property
    def start(self):
        val = (self.current_page - 1) * (self.per_items)
        return val

    @property
    def end(self):
        val = self.current_page * self.per_items
        return val


p = Pager(1)
print(p.start)  # 就是起始值,即:m
print(p.end)  # 就是結束值,即:n
           

從上述可見:

python的

property

屬性的功能是:property屬性内部進行一系列的邏輯計算,最終将結果傳回

3、property屬性的兩種方式

  • 裝飾器 即:在方法上應用裝飾器
  • 類屬性 即:在類中定義值為property對象的類屬性

3.1 裝飾器方式

在類的執行個體方法上應用

@property

裝飾器

Python中的類有 經典類 和 新式類 ,新式類 的屬性比 經典類 的屬性豐富。(如果類繼承object,那麼該類是新式類)

經典類,具有一種@property裝飾器
class Goods:
    @property
    def price(self):
        return "laowang"


obj = Goods()
result = obj.price  # 自動執行 @property 修飾的price方法,并擷取方法的傳回值
print(result)
           
新式類,具有三種@property裝飾器
class Goods:
    """
    隻有在python3中才有@xxx.setter  @xxx.deleter
    """
    @property
    def price(self):
        print("@property")

    @price.setter
    def price(self, value):
        print("@price.setter")

    @price.deleter
    def price(self):
        print("@price.deleter")


obj = Goods()
obj.price  # 自動執行 @property 修飾的 price 方法,并擷取方法的傳回值
obj.price = 123 # 自動執行 @price.setter 修飾的 price 方法,并将 123 指派給方法的參數
del obj.price  # 自動執行 @price.deleter 修飾的price方法
           

注意:

  • 經典類中的屬性隻有一種通路方式,其對應被

    @property

    修飾的方法
  • 新式類中的屬性有三種通路方式,并分别對應了三個被

    @property

    @方法名.setter

    @方法名.deleter

新式類的執行個體
class Goods(object):

    def __init__(self):
        # 原價
        self.original_price = 100
        # 折扣
        self.discount = 0.8

    @property
    def price(self):
        # 實際價格 = 原價 * 折扣
        new_price = self.original_price * self.discount
        return new_price

    @price.setter
    def price(self, value):
        self.original_price = value

    @price.deleter
    def price(self):
        del self.original_price


obj = Goods()
obj.price = 200  # 修改商品原價
print(obj.price)  # 擷取商品價格
del obj.price  # 删除商品原價
           

3.2 類屬性方式,建立值為property對象的類屬性值

  • 當使用類屬性的方式床啊進property屬性時, 經典類 和 新式類 無差別
class Foo:
    def get_bar(self):
        return "lao"

    BAR = property(get_bar)


obj = Foo()
result = obj.BAR  # 自動調用 get_bar 方法,并擷取方法的傳回值
print(result)
           

property方法中有四個參數:

  • 第一個:方法名,調用 對象.屬性 時自動觸發執行方法
  • 第二個:方法名,調用 對象.屬性 = XXX 時自動觸發執行方法
  • 第三個:方法名,調用 del 對象.屬性 時自動觸發執行方法
  • 第四個:字元串,調用 對象.屬性.__doc__,此參數是該屬性的描述資訊
class Foo(object):
    def get_bar(self):
        print("getter....")
        return 'lao'

    def set_bar(self, value):
        """必須兩個參數"""
        print("setter....")
        return 'set value '+ value

    def del_bar(self):
        print("deleter....")
        return 'lao'

    BAR = property(get_bar, set_bar, del_bar, "description...")


obj = Foo()

obj.BAR  # 自動調用第一個參數中調用的方法:get_bar
obj.BAR = 'alex'  # 自動調用第二個參數中調用的方法:set_bar,并将‘alex’仿做參數傳入
desc = Foo.BAR.__doc__  # 自動擷取第四個參數中設定的值:description...
print(desc)
del obj.BAR
           

由于 類屬性方式 建立

property

屬性具體有三種通路方式,我們可以根據他們幾個屬性的通路特點,分别将三個方法定義為同一屬性:擷取、修改、删除

3、總結

  • 定義

    property

    屬性共有兩種方式,分别是【裝飾器】和【類屬性】,而【裝飾器】方式針對經典類和新式類又有所不同
  • 通過使用

    property

    屬性,能夠簡化調用者在擷取資料的流程

4、應用

我們都知道,對于類方法的變量屬于私有變量,是無法進行讀寫的,我們便可以使用

property

getter

setter

來進行私有變量的讀寫。

4.1 類屬性方式

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方法 
           

4.2 裝飾器

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

	@property
	def money(self):
		return self.__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)