遇到一個需求,需要為單例物件新增方法,這個方法來自于單例的子類或是一個獨立的函式,
在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) # <function function at 0x7f82b05c5ea0>
print(p.function) # <bound method function of <__main__.Person object at 0x7f82b07e3400>>
可以看到,確實如我們預期的樣子,它成功的將function 系結到了實體空間中,并且我們能像使用實體的方法一樣通過 obj.方法名 來呼叫他,同時也會將實體作為第一個引數,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/117818.html
標籤:Python
上一篇:手把手教你用 Python + Flask 搭建個人博客
下一篇:Python 正則
