類中函式的三種裝飾器

2021-08-25 11:14:27 字數 1877 閱讀 6897

一,,property,

property裝飾器是用來將類內的函式屬性偽裝成資料屬性

class people:

def __init__(self,name,weight,height):

self.name = name

self.weight = weight

self.height = height

@property

def bmi(self):

return self.weight/(self.height**2)

obj = people('egon',80,180)

print(obj.bmi)

# 解釋:bmi在類內定義的是函式,在用的時候已經被property裝飾過的可以當作屬性來用,用之前可以設定幾個條件,不用加括號

class people:

def __init__(self,name):

self.__name=name

@property

def name(self):

return '《名字:%s>' %self.__name

@name.setter

def name(self,obj):

if type(obj) is not str:

print('name必須為str型別')

return

self.__name=obj

@name.deleter

def name(self):

# print('不讓刪')

del self.__name

obj=people('egon')

# 解釋:bmi在類內定義的是函式,如果想在類外面對隱藏的變數進行更改時,如下:

@name.setting

def name(self,obj):

if  type(obj) is not str:

print('name必須為str型別')

return

self.__name = obj

# 刪除的時候

@name.deleter

def name(self):

del self.__name

二,(一)繫結方法:繫結給誰就應該由誰來呼叫,誰來呼叫就會將誰當作第乙個引數傳入

# @classmethod    :被它裝飾的函式繫結給類

1,繫結給物件的方法:類中定義的函式預設就是繫結給物件的

2,繫結給類的方法:為類中定義的函式加上乙個裝飾器classmethod

(二)非繫結方法:既不與類繫結,又不與物件繫結,意味著物件和類都可以來呼叫,無論誰來呼叫都是乙個普通的函式,沒有自動傳值的效果

@staticmethod:被它裝飾的函式不用被傳值

應用:class mysql:

def __init__(self, ip, port):

self.id = self.create_id()

self.ip = ip

self.port = port

def tell_info(self):

print('' % (self.id, self.ip, self.port))

@classmethod

def from_conf(cls):

return cls(ip, port)

@staticmethod

def create_id():

import uuid

return uuid.uuid4()

# obj1=mysql('1.1.1.1',3306)

# obj1.tell_info()

obj2 = mysql.from_conf()

obj2.tell_info()

python裝飾器三種裝飾模式的簡單分析

學設計模式中有個裝飾模式,用j a實現起來不是很難,但是遠遠沒有python簡單,難怪越來越火了 這裡就簡單討論下python的幾種裝飾模式 一 無參裝飾器 裝飾器 import time 裝飾器,記錄函式執行時間 def decorator01 fun def wapper stime time....

函式裝飾器 類裝飾器

一 函式裝飾函式 defwrapfun func definner a,b print function name func.name r func a,b return r return inner wrapfun defmyadd a,b return a b print myadd 2,3 二...

python裝飾器 函式裝飾器,類裝飾器

只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...