動態的為 物件繫結方法

2022-08-20 16:39:11 字數 1125 閱讀 8613

遇到乙個需求,需要為單例物件新增方法,這個方法來自於單例的子類或是乙個獨立的函式。

python中例項的方法由建立它的類來提供,也就是方法是屬於類的,在物件空間中並不存在。但是通過例項來修改其類的方法或屬性不是乙個好的行為。這會讓程式看起來非常糟糕。

我們希望將方法繫結到物件的空間中。雖然這看起來也不符合變成習慣,但是總比修改類來的優雅。

python 在types.methodtype中提供了這樣的方法。

import types

class person(object):

""" 定義乙個屬性 name 和乙個方法 func """

def __init__(self, name):

self.name = name

# 例項化時就會賦予的方法

def func(self):

print("old method!\n\rmy name is %s ." % self.name)

p = person('monkey')

# 為 person 的例項動態新增這個方法 必須穿入 self 物件 代表例項本身

def function(self, *args, **kwargs):

print("new method!\n\rmy name is %s ." % self.name)

# types.methodtype 方法 會將 第乙個引數作為繫結方法,繫結到 第二個引數中 同時將例項本身作為第乙個引數傳入。

p.function = types.methodtype(function, p)

p.func()

p.function()

print(id(function)) # 140414285538712

print(id(p.function)) # 140414256994760

print(function) # print(p.function) # >

可以看到,確實如我們預期的樣子,它成功的將function繫結到了例項空間中。並且我們能像使用例項的方法一樣通過obj.方法名來呼叫他。同時也會將例項作為第乙個引數。

動態繫結方法

bind 單事件繫結 selector bind event,data,function 多事件繫結 selector bind 多個觸發條件進行不同的操作 selector bind event1 event2 event3 data,function 多個觸發條件進行同樣的操作 live sel...

類和物件的繫結方法與非繫結方法

類的定義方法大致可以分為兩類 繫結方法和非繫結方法 其中繫結方法又可以分為繫結到物件的方法和繫結到類的方法 class person def init self,name,age self.name name self.age age defprint name self print self.na...

Vue 動態繫結 class 的方法

class classname 如上示例是最簡單的動態繫結,但好像沒有任何意義,和不動態繫結的結果是一樣的。class 當 條件表示式 為true時,則繫結 class 條件表示式 classname1 classname2 當 條件表示式 為 true 時繫結 classname1 否則 繫結 c...